Effective C++ 学习笔记(6)
2011-04-13 10:17 Daniel Zheng 阅读(270) 评论(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时也不要用[]。