[c++基础] delete 和 delete []的区别
2020-12-02 02:31
标签:建议 double 整理 span rtm let pre 通过 记录 整理摘自:https://www.cnblogs.com/wangjian8888/p/7905176.html 1. delete 释放new分配的单个对象指针指向的内存; 1)对于简单类型,内存大小已确定,析构时系统可直接通过指针获取实际分配的内存空间并释放; 2)对于类对象数组,仅调用数组首对象的析构函数,剩下对象的空间不能被释放; 2. delete[] 释放new分配的对象数组指针指向的内存。 1)对于简单类型,效果同delete,可以释放数组内存空间; 2)对于类对象数组,将逐一调用数组中每个对象的析构函数,释放了指针指向的全部内存空间。 这种情况下释放效果相同,原因在于:分配简单类型内训时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会直接调用析构函数,它直接通过指针获取实际分配的内存空间,(数组的内存空间也同样会被系统记录,保存在结构体CrtMemBlockHeader中)。 对于(1), 仅释放了a指针指向的全部内存空间,即为调用了a[0]对象的析构函数; 但是剩余的a[1], ..., a[9]这9个对象自行分配的m_cBuffer对应的内存空间将不能释放。 g++11 编译通过,运行报错:*** Error in `./delete_test‘: double free or corruption (fasttop): 0x0000000000ef4c20 *** 对于(2), 调用类对象的析构函数释放对象自己分配的内存空间,可以逐一调用数组中每个对象的析构函数,释放了a指针指向的全部内存空间。 与原博客中显示结果不同,在用g++11编译通过,运行时 (1) 报错。 在对数组释放空间时,建议选用delete [], 如果程序的类使用了操作系统的系统资源(Socket, File, Thread等),使用delete[]会使得对象逐一调用析构函数,释放系统资源。 [c++基础] delete 和 delete []的区别 标签:建议 double 整理 span rtm let pre 通过 记录 原文地址:https://www.cnblogs.com/shiyublog/p/10986278.html1. 区别
2. 针对简单类型
1 int *a = new int[10];
2 delete a;
3 delete []a;
3. 针对类对象数组
1 class A
2 {
3 private:
4 char *m_cBuffer;
5 int m_nLen;
6 public:
7 A() {m_cBuffer = new char[m_nLen]; }
8 ~A() {delete [] m_cBuffer;}
9 };
10
11 A *a = new A[10];
12 delete a; // (1)
13 delete []a; //(2)
4. 示例说明
1 #include
上一篇:JVM-垃圾回收算法
文章标题:[c++基础] delete 和 delete []的区别
文章链接:http://soscw.com/index.php/essay/23166.html