可能重复:
How could pairing new[] with delete possibly lead to memory leak only?
(POD)freeing memory : is delete[] equal to delete?删除数组时删除和删除[]是否一样?
使用GCC 4.1.2版20080704(红帽4.1.2-48)。没有在Visual C++上测试过它。
看起来delete
和delete []
在删除“简单”类型的数组时相同。
char * a = new char[1024];
delete [] a; // the correct way. no memory leak.
char * a = new char[1024];
delete a; // the incorrect way. also NO memory leak.
但是,在删除“复杂”类型的数组时,delete
会导致内存泄漏。
class A
{
public:
int m1;
int* m2; // a pointer!
A()
{
m2 = new int[1024];
}
~A()
{
delete [] m2; // destructor won't be called when using delete
}
};
A* a = new A[1024];
delete [] a; // the correct way. no memory leak.
A* a = new A[1024];
delete a; // the incorrect way. MEMORY LEAK!!!
我的问题是:
- 在第一次测试的情况下,为什么
delete
和delete []
正在得到的相同++? - 在第二个测试用例中,为什么g ++不像第一个测试用例那样处理它?
您是如何确认在第一种情况下没有内存泄漏并且在这两种情况下都没有内存错误? – neuront
请仔细阅读这个问题 - http://stackoverflow.com/q/1913343/57428其中详细解释了所有原因。 – sharptooth
就内存释放而言,它可能会像第一种情况一样处理它。在这两种情况下,总分配大小通常以相同的方式存储,所以内存得到正确释放。 但是,delete []被设计为为每个分配的对象调用析构函数,而delete只会在第一个对象上调用它,即a [0]。 这就是内存泄漏发生的原因。 A对象内部的int数组未被释放,因为析构函数未被调用,但A对象的初始分配被正确释放。 无论哪种方式,这是不可移植的未定义的行为。 –