menu

hjk41的日志

Avatar

Effective C++ 笔记5: 使用相同形式的 new 和 delete

new 和 delete 有两种形式,带 [] 的和不带 [] 的
比如:

string *stringPtr1 = new string;    // new without []
string *stringPtr2 = new string[100];   // new with []
...
delete stringPtr1;           // delete an object 
delete [] stringPtr2;        // delete an array of
                             // objects

不带 [] 的 new 和 delete 用于产生和销毁一个指向单个对象的指针,而带 [] 的则用于对象数组

在上面的例子中,如果用 delete stringPtr2 会出什么情况呢?
delete 函数会先调用一个(如果是delete[]则调用多个)destructor,然后释放指针所指向的内存。所以如果用 delete stringPtr2 ,string::~string()会被调用一次,然后s tringPtr2 就被释放了,显然这样会造成内存泄漏,因为有99个 string 对象实例没有被析构。

如果用 delete stringPtr1 又会是什么情况呢?
delete[] 函数会先检查 stringPtr1 包含多少个 string ,然后它会对每个对象调用析构函数,好像没问题啊,问题在于它会对 stringPtr1[0] 调用析构函数,而 stringPtr1[0] 谁也不知道是什么东西。

评论已关闭