在看面试宝典的时候 ,书上有一段程序写下来一堆错误,google下 是delete 和delete []的区别
首先看一下错误代码和错误结果:
#include <stdio.h>
class CTest
{
public:
~CTest()
{
printf("~CTest dtor\n");
}
};
int main()
{
CTest *p = new CTest[10];
printf("%d\n" ,*((int *)p-1));
delete p;
return 0;
}
错误结果:
可以看到 ,这里调用了一次析构函数,打印输出了一次,剩下的是一堆错误(如果指针错误的话 经常会遇到这种问题,内容具体是什么搞不懂)
delete 与 delete [] 的区别:
operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:
void* operator new (size_t); // allocate an object
void* operator new [] (size_t); // allocate an array
void operator delete (void*); // free an oject
void operator delete [] (void*); // free an array
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
用new的时候会发生两件事。首先,内存被分配,然后,为被分配的内存调用一个或多个构造函数。用delete的时候,也有两件事发生:首先,为将被释放 的内存调用一个或多个析构函数,然后,释放内存。对于 delete来说会有这样一个重要的问题:内存中有多少个对象要被删除?答案决定了将有多少个析构函数会被调用。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 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[]
![](https://img-my.csdn.net/uploads/201304/26/1366945934_6813.png)