【发布时间】:2011-10-20 16:10:39
【问题描述】:
可能的重复:
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 (Red Hat 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!!!
我的问题是:
- 第一个测试用例,为什么g++下
delete和delete []是一样的? - 第二个测试用例,为什么g++不像第一个测试用例那样处理?
【问题讨论】:
-
您如何确认第一种情况没有内存泄漏,两种情况都没有内存错误?
-
请仔细阅读这个问题 - stackoverflow.com/q/1913343/57428 详细解释了所有原因。
-
就内存释放而言,它的处理方式可能与第一种情况相同。在这两种情况下,总分配大小通常以相同的方式存储,因此内存被正确释放。但是,delete[] 旨在为每个分配的对象调用析构函数,而 delete 只会在第一个对象上调用它,即 a[0]。这就是发生内存泄漏的原因。 A 对象内部的 int 数组没有被释放,因为没有调用析构函数,但 A 对象的初始分配被正确释放。无论哪种方式,这都是不可移植的未定义行为。
标签: c++ arrays memory-management g++