文档章节

delete和delete[] 的深度思考

梦想游戏人
 梦想游戏人
发布于 2016/04/07 19:55
字数 540
阅读 116
收藏 0

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的首地址 发现如图信息

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[]

© 著作权归作者所有

梦想游戏人
粉丝 41
博文 461
码字总数 132517
作品 0
成都
私信 提问
phalcon 框架软删除与物理删除思考与实现

---title: phalcon 框架软删除与物理删除思考与实现date: 2018-09-11 11:44:36tags:PHP phalcon phalcon 框架软删除与物理删除思考与实现 在项目开发中,业务的不同则对数据库中数据的操作也是...

anziguoer
2018/09/11
39
0
【原创】RabbitMQ之Queue属性测试

常用queue属性 在 rabbitmq-c代码中可以看到如下代码 上图所示为queue声明时使用的结构体。其中最容易让使用者迷惑的3个属性是durable、exclusive和auto_delete。 上图所示为consumer从queue...

摩云飞
2015/03/26
3.1K
0
【C++】第12章 类和动态内存分配 知识点总结

《C++ Primer Plus》第12章知识点总结 在构造函数中使用new时应注意的事项 (1)如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete (2)new和delete必须互相兼容。new...

qq_37792173
2017/11/27
0
0
JPA实体关系映射补遗:有关mappedBy的思考

本文阅读时间3分钟。由作者三汪首发于简书。 几个月前写了一篇《JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析》,简要阐述了我对...

三汪
2017/11/01
0
0
(2)预期+思考【利用objective-c的runtime特性,结合FMDB实现轻量级的ORM】

版权声明:本文为博主原创文章,未经博主允许不得转载。 (本ORM的源码已经上传到github上 (https://github.com/helloclq/BCSqliteORMFMDB),大家可以下载测试,如发现什么问题或意见,欢迎大...

辉兔狼
2015/09/10
298
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
38分钟前
3
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部