这是国泰君安技术面出的题
先说结论
如果是删除原始的数据类型,并不会发生什么,也不会产生内存泄露。如果是删除自定义类型,比如说类和结构体,则只能删除第一个,后面的可能会内存泄露。
一、删除原始数据类型
举个例子
int* p1 = new int[10];
delete p1;
上面的这段代码是未定义行为,具体的实现要看编译器怎么处理,常见的编译器如GCC,CLANG,MSVC都会正确释放,甚至连一个warning都没有
二、删除自定义类型
举个例子
class T
{
public:
T() { cout << "constructor" << endl; }
~T() { cout << "destructor" << endl; }
};
int main()
{
T* p2 = new T[3];
cout << p2 << endl;
delete p2;
system("pause");
return 0;
}
这段代码只会执行数组中第一个对象的析构函数,后面的对象就会有发生内存泄露的风险。比如后面的对象申请了一块内存,此时这块内存就再也收不回来了。
运行一下,会报warning
我个人的见解
删除自定义类型时就相当于删除第一个对象,缺少符号[]就不会循环去执行每个对象的析构函数,二是拿到指针后,析构一下这个对象,然后free这个指针地址,看似这块地址空间是没了,但是后面的对象没有析构。