博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
delete和delete[] 的深度思考
阅读量:6273 次
发布时间:2019-06-22

本文共 1184 字,大约阅读时间需要 3 分钟。

hot3.png

2者似乎没有表面上看起来 (一个删除new出来的对象 一个删除对象数组) 那么简单,

他们还有着以下关系 基本类型 和 非基本类型的区别

对于基本数据类型int char 等等  的数组 

delete 等效于 delete[]

这似乎听起来很玄乎,和老师教的完全不一样

通常delete[] 用于删除数组 以下代码

、、	  auto array  =  new int[2] ;
  1. 用Dr memory 检测泄露 8 bytes

  2. 用_CrtDumpMemoryLeaks() 检测也是8 bytes  宏_CRTDBG_MAP_ALLOC 可以限制具体信息

这结论都是知道的 那么我们来delete 和delete[]

A.对于delete  DR memory 没有检测到泄露 只是出现了警告 (invalid heap argument)

    _CrtDumpMemoryLeaks() 没有检测到泄露

B.对于delete[] 肯定都没问题的

 

以下代码就是该文 提出的问题所在

、、static int count1 = 5;class A{public:	int x = count1;	~A()	{		cout << "~A" << endl;	}	A()	{		count1++;	}};int main(int argc, char *argv[]){	auto array = new A[2];	//delete array;	_CrtDumpMemoryLeaks();	system("pause");	return 0;}

2个检测泄露方法都显示泄露12 bytes sizeof A显示是4字节,那么多出的四字节是怎么回事呢,结果进一步验证 发现是 记录对象个数 (经过反复测试)的 4字节变量 应该是unsigned int

定位到array的首地址 发现如图信息

200740_8WJc_1391394.png

intel X86 是小端模式所以地址低到高是  2 5 6 array的地址就是5的地址,可见编译器在实际对象地址之前多分配了4个字节,所以为了保证被分配的内存

全部被归还heap 必须用delete[] 来删除 delete将不会正确删除 

断点调试delete[]前后发现 证明了 会删除 256 这3个变量

经验证  release 模式下也是如此

进一步发现 VC 下的文件dbgdel.cpp dbgdel2.cpp 有delete  delete[]  等CRT 源码

如果类A不带析构函数 那么久不会出现该问题

 

结论:

非基本类型的对象数组 删除请用delete[]  

基本数据类型的数组删除可用delete和delete[] 为了记忆的一致性 还是最好用delete[]

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/654740

你可能感兴趣的文章
LCD的接口类型详解
查看>>
Spring Boot Unregistering JMX-exposed beans on shutdown
查看>>
poi 导入导出的api说明(大全)
查看>>
Mono for Android 优势与劣势
查看>>
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>