Effective C++ Item 16-成对使用new和delete时要采取相同形式

来源:互联网 发布:程序员需要学哪本书 编辑:程序博客网 时间:2024/05/22 10:35

成对使用new和delete时要采取相同形式
Use the same from in corresponding uses of new and delete

Ex:

std::string* stringArray = new std::string[100];...delete stringArray;

上面的程序使用delete删除stringArray对象数组,很可能只删除了一个对象,剩下的99个的析构函数很可能没被调用。

new和delete做了什么

当使用new动态生成对象时,有两件事发生:

  • 分配内存(通过名为operator new函数)
  • 针对此内存会有一个(或更多)构造函数被调用

当使用delete时,也有两件事发生:

  • 针对此内存会有一个(或更多)析构函数被调用
  • 释放内存(通过operator delete的函数)

如果要释放多个对象时,delete怎么知道即将被删除的内存之内究竟存有多少对象?这决定要使用多少次析构函数。换句话说,即将被删除的那个指针,所指的是单一对象还是对象数组。数组所用的内存通常还包括”数组大小”的记录,以便delete知道需要调用多少次析构函数。

new[]和delete[]

单一对象和对象数组的内存布局:
这里写图片描述

如果使用delete[]删除这个指针,delete[]会认为这个指针指向一个数组,会先取对象数组开头的数组大小n,然后调用n次析构函数

Ex:

std::string* stringPtr1 = new std::string;   // 删除一个对象std::string* stringPtr2 = new std::string[100];  //删除一个由对象组成的数组

因为new/detele和new[]/delete[]的过程不一样,所以new/detele和new[]/delete[]必须成对使用。

参考资料

《Effective C++》

阅读全文
0 0
原创粉丝点击