条款5:对应的new和delete要采用相同的形式 (第二章 内存管理)

来源:互联网 发布:ubuntu查看系统分区 编辑:程序博客网 时间:2024/06/07 11:46
C++中涉及到的内存的管理问题可以归结为两方面:正确地得到它和有效地使用它。

    然而,C++其实从C继承了一个很严重的头疼病,那就是内存泄漏隐患。在C中,只要用malloc分配的内存没有用free返回,就会产生内存泄漏。在C++中,肇事者的名字换成了new和delete,但情况基本上是一样的。

   当然,因为有了析构函数的出现,情况稍微有改善,因为析构函数为所有将被摧毁的对象提供一个方便的调用delete的场所。但是这同时又带来了更多的烦恼,因为new和delete是隐式地调用构造函数和析构函数的。这会增加出错的机会。

int main()
{
        string *stringarray = new string[100];
        delete stringarray;
}

这样的程序看起来好像一切都井然有序,一个new对应着一个delete---然而却隐藏着很大的错误:程序的运行情况将是不可预测的。上面的程序在编译器g++下就出现下面的运行错误:Segmentation fault

  用new的时候会发生两件事:1.内存被分配,2.为被分配的内存调用一个或多个构造函数。

    用delete的时候,也有两件事发生:1.为将被释放的内存调用一个或多个析构函数,2.释放内存。

 

#include <iostream>
#include <string.h>
using namespace std;

typedef string addresslines[4];


int main()
{
        string *pa1 = new addresslines;
        pa1[0] = "first";
        pa1[1] = "second";
        pa1[2] = "third";
        pa1[3] = "four";
        delete pa1; //错误
}


代码中的delete pa1;是错误的,必须使用delete[] pa1;

所以为了避免混乱,最好不要对数组类型用typedefs。
原创粉丝点击