一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

请看下面的程序。

#include <iostream>;

using namespace std;

class T {

public:

T() { cout << "constructor" << endl; }

~T() { cout << "destructor" << endl; }

};

int main()

{

const int NUM = 3;

T* p1 = new T[NUM];

cout << hex << p1 << endl;

// delete[] p1;

delete p1;

T* p2 = new T[NUM];

cout << p2 << endl;

delete[] p2;

}

大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。

从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。 基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

最新文章

  1. 简单实用angular.js购物车功能
  2. 浅谈Java中的equals和==
  3. 关于apache做301的问题
  4. MVC使用x.PagedList分页
  5. iframe的自适应
  6. 如何在 apache 中开启 gzip 压缩服务
  7. 斯坦福大学 iOS 7应用开发 ppt
  8. Pro Git(中文版)
  9. .NET高端职位招聘要求
  10. HDU-4974 A simple water problem
  11. 【5】将服务部署到本机(Ubuntu14.04)
  12. Hibernate之dynamic-update
  13. iOS开发从申请账号到上线APP Store步骤
  14. gradle一个已删除的项目找不到
  15. For oracle databases, if the top showing the oracle database, then oracle process is using the top c
  16. XDM-跨文档消息传送
  17. Matlab2017A破解版安装详细图文教程(附破解补丁) 64位
  18. 129. Sum Root to Leaf Numbers pathsum路径求和
  19. HBase的Write Ahead Log (WAL) —— 整体架构、线程模型【转】
  20. Kafka核心组件

热门文章

  1. (2018干货系列三)最新PHP学习路线整合
  2. rpm检验是否被改动过
  3. 2.1 存储器域与PCI总线域
  4. zTree实现地市县三级级联报错(三)
  5. USB转串口驱动代码分析
  6. 使用VLC和live555MediaServer搭建RTSP服务器
  7. winhex中判断+MBR+DBR+EBR方法
  8. FtpHelper ftp操作类库
  9. JDBC连接池-自定义连接池
  10. Java并发系列[8]----CyclicBarrier源码分析