代码改变世界

Effective C++ 学习笔记(6)

2011-04-13 10:17  Daniel Zheng  阅读(267)  评论(1编辑  收藏  举报

对应的new和delete要采用相同的形式

  我们看下面的代码:

    string *stringArray=new string[100];

    ...

    delete stringArray;

  上述代码看上去没错,实际上程序的运行情况将是不可预测的。stringArray指向的100个string对象中的99个不会被正确的摧毁,因为他们的析构函数永远不会被调用。

  使用new的会触发两件事情。首先内存被分配,然后为被分配的内存调用一个或多个构造函数。同样,调用delete时也会触发两件事情。首先是为将被释放的内存调用一个或多个析构函数,然后是释放内存。这里,对于一个delete操作而言会有这么一个问题:内存中有多少个对象要被删除?这个答案决定了有多少个对象要被析构。

  这个问题等同于:要被删除的指针对象指向单个对象,还是指向一个对象的数组?这里需呀由程序员显示告诉编译器。如果你在使用delete时没有使用[]符号,那么delete就认为要删除的是单个对象,反之则认为是对象数组,所以正确的代码如下:

    string *stringPtr1=new string;

    string *stringPtr2=new string[100];

    ...

    delete stringPtr1;

    delete [] stringptr2;

  如果你在stringPtr1前面加了[],那么结果将是不可预测。如果你在stringPtr2前面没有加[],那么结果同样是不可预测。

  这条规则简单记忆为:如果new的时候用了[],调用delete的时候也要用[]。如果new的时候没有用[],那么调用delete时也不要用[]。