对new, delete, delete[]的理解
来源:互联网 发布:爱淘宝 每日抽红包 编辑:程序博客网 时间:2024/06/15 20:35
1. 当你使用new时,有两件事会发生。第一,内存被配置(透过函数operator new)。第二,会有一个(或以上)的constructors针对此内存被调用。当你使用delete时,也有两件事发生:一个(或以上)的destructors会针对此内存被调用,然后内存被释放(透过函数operator delete)。
2. 如果你使用delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组。
3. string *stringPtr1 = new string;
string *stringPtr2 = new string[100];
……
delete stringPtr1;
delete [] stringPtr2;
如果你对着stringPtr1使用“[]”形式,其结果未定义。如果你对着stringPtr2没有使用“[]”形式,其结果亦未定义。犹有进者,这对内建型别如int者亦未定义,即使这类型别并没有destructors。
4. 因此,游戏规则很简单,如果你在调用new时使用了[],则你在调用delete时也使用[],如果你在调用new的时候没有[],那么你也不应该在调用时使用[]。
还有要注意的:new和delete必须成对出现,否则会造成内存泄露。
请看下面的程序。
#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[] 对应使用。
- 对new, delete, delete[]的理解
- 对delete的理解
- new,delete的一点理解
- 对new和delete的理解,灵活使用
- 对new/delete和malloc/free的理解
- 理解new和delete
- class new delete的一点理解
- new delete mallco free 的深刻理解
- new/delete和对数组的重命名
- 关于对new和delete的认识
- new delete的问题
- new/delete 的用法
- new, delete 的用法
- C ++的new、delete
- C++ 中的 new/delete 和 new[]/delete[]深入理解
- C++中operator new 和 new operator小结以及对new 和 delete初步理解
- new()和delete()以及delete,和delete[]的区别
- 类特定的new和delete的使用及理解
- jdbc(补充)
- JAVA WEB_JSP的初步(10)
- Posix线程编程指南(1)
- ServletConfig对象
- HttpServletRequest简介
- 对new, delete, delete[]的理解
- EL表达式的基本语法
- PHP获取访客IP和地理位置
- 保存会话数据的两种技术
- 操作符
- UML图表
- El表达式的使用
- 开发模式和设计模式的实例--注册
- EL表达式的隐式对象