delete与delete[]
来源:互联网 发布:广告字设计软件 编辑:程序博客网 时间:2024/06/05 18:59
delete与delete[]
1、 一个大家容易忽略的问题:
定义:int *p=new int;
这个大家一看就知道,在内存中分配了一个int类型的空间,没错。但是我想说的是,操作系统在堆在分配了一个int类型空间给p指向的空间,但是p本身的值是在栈上,我觉的明白这个很重要。比如,你需要处理一个海量数据,这个数据需要用二维数组来表示,你如果这样定义int *ptr[MaxNum],然后再循环为每个ptr[0~MaxNum-1]分配空间,这个时候容易隐含一个错误,我们知道内存中栈的大小大约就2M左右,而堆很大,几乎没有限制,当你的MaxNum很大的时候,就会导致内存溢出,因为ptr这个值的本身是在栈上的,而栈的大小就2M左右,而你又有这么多个地址要存放,所以会出错。
解决办法有两个:
一、用一维数组代替二维数组
二、定义一个二维指针, 然后再动态分配
2、delete与delete[]执行遇到的问题:
① int *p=new int[100];
int num[100];
p=num;
delete []p;
此段代码有何问题?——delete并非释放new分配的空间
错误是发生在delete []p
为什么呢?按理说用new[]申请,用delete[]释放,应该没有问题啊。但是错误发生的原因是delete[]p释放的是数组num[100]的空间,而我们申请的空间根本就没有释放,为什么会出现这种情况呢?因为此时的指针已指向了num数组的首地址,而num[100]的空间会由系统自动释放,而我们现在强行释放,所以会发生错误。
② int *p=new int[3];
*p=1;
p++; //p的指向改变了,指向了下一空间
*p=2;
delete []p;
此段代码有何问题?——释放指针应为对象首地址
错误还是发生在delete[]p
C/C++规定,当删除一个指针时,这个指针应指向其首地址,而上面的代码中p值已经发生了变化,所以会发生错误。
如何避免呢?可以备份一份:
如 int * pBack=p;在释放的时候,用delete[] pBack即可。
③ int* p = new int[10];
int *pp=p;
delete []p;
delete []pp;
此段代码有何问题?——内存空间的重复释放
我们要知道,p向操作系统申请了10个int类型的空间,而pp只是指向这个空间,操作系统并没有为其再分配10个int类型的空间,所以当你用delete[]p释放这个空间后,再用delete[]pp释放就会发生错误。其实不管用哪个释放,只要释放一次就行了。
④ int a=100;
int *p=&a;
delete p;
此段代码有何问题?——没有new分配的空间
错误还是发生在delete p
什么原因?
因为p并没有通过new获得内存空间,只是指向某个变量,而delete p是强行释放a的空间,肯定发生错误啦。
3、delete与delete[]的区别
我们首先要知道当delete的时候,系统会自动调用已分配的对象的析构函数。
那么当我们用new[]分配的对象是基本数据类型的时候,用delete和delete[]没什么区别,都可以。但是当用new[]分配的对象是自定义类型的时候,必须要用delete[],这样它才会调用每个对象的析构函数,除非你的析构函数没有做任何事。
总结一句话:使用 new 得来的空间,用 delete 来释放;使用 new [] 得来的空间,必须用 delete [] 来释放。这样肯定不会错。
- delete与delete[]
- delete 与 delete [] 区别
- delete与delete[]区别
- delete与 delete []区别
- delete 与delete[]
- delete 与 delete[]
- c++ delete与delete[]
- delete与delete[]
- delete与delete[]
- {c++}delete与delete[]
- delete [] 与delete
- delete []与delete区别?
- C++ delete与delete[]
- delete 与delete[]
- delete与 delete []区别
- delete与delete[]区别
- delete与delete[]的区别
- delete与delete [] 真正区别
- Generic Reflection
- ie下弹出窗口设置
- oracle导出表结构到sql文件
- 对反射机制的学习理解
- 十进制小数转二进制小数方法
- delete与delete[]
- Spring简单入门实例
- 设置鼠标样式
- django admin自定义
- 使用ListPreference时,列表框中不显示内容
- vbs 的 GB2312ToUnicode
- easyUI属性汇总
- 字典树(trie树)
- 三层架构与MVC的区别