C++中的delete和delete[]的区别
2016-04-05 18:59
239 查看
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
请看下面的程序。
大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。
从运行结
果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2]
等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
转载自:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
请看下面的程序。
1 #include <iostream>; 2 using namespace std; 3 4 class T { 5 public: 6 T() { cout << "constructor" << endl; } 7 ~T() { cout << "destructor" << endl; } 8 }; 9 10 int main() 11 { 12 const int NUM = 3; 13 14 T* p1 = new T[NUM]; 15 cout << hex << p1 << endl; 16 // delete[] p1; 17 delete p1; 18 19 T* p2 = new T[NUM]; 20 cout << p2 << endl; 21 delete[] p2; 22 }
大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。
从运行结
果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2]
等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
转载自:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html
相关文章推荐
- 内存泄漏查找c++ new delete
- 重载函数调用运算符()
- KMP算法(c++)实现
- C++ 流以及文件操作
- 关于几个优化
- C语言switch语句必须包含default分支吗
- C语言中的指针和内存泄漏
- 类的静态数据成员声明、定义、初始化
- ACE的构建(VC++6.0环境)
- C++ lambda表达式
- register关键字,valatile关键字
- C++中动态申请二维数组并释放方法
- C++全局变量的声明和定义
- C++强制类型转化
- 多维数组和指针
- C++虚析构函数的作用
- effective c++ 条款
- 虚幻引擎CPP函数传入数组有时候编译不过的bug。
- C++的new和delete工作机理
- C++primer 练习11.33:实现你自己版本的单词转换程序