C++中的delete和delete[]的区别(笔记)
最近在准备校招,这里做一些面试或笔试遇到的问题的笔记,加深记忆的同时也预防下次出现容易找到答案
这一次谈一下delete 和delete[]的区别
在C++ primer (中文第五版,p425)中指出:
- delete p 是直接删除指针所指向的内存空间,回收new 分配的单个对象的内存空间, p必须指向一个动态分配的对象或为空;
- delete[] pa 则是先计算pa所对应空间有多少个变量或对象,然后全部释放或调用相应的析构函数(数组元素是按逆序销毁),pa必须指向一个动态分配的数组或为空;
同时,书中指出若delete 一个指向数组的指针时忽略了[] (或 对一个单一对象用了delete []) ,该行为为未定义的,但编译器可能不会给出警告。
具体用代码实验下:
new[] 搭配 delete使用
using namespace std;
class T {
public:
T() { cout << "constructor" << endl; } // 构造函数
~T() { cout << "destructor" << endl; } // 析构函数
};
int main()
{
const int NUM = 3;
T* pa = new T[NUM];
cout << pa << endl;
delete pa;
// delete[] pa;
}
上述为new一个长度为3的数组,但只delete一次,结果如下:
new[] 搭配 delete[]使用
正确应该为:
所以:new 和 delete、new[] 和 delete[] 对应使用。