删除数组时删除和删除[]是否相同?

jar*_*jar 4 c++ arrays memory-management g++

可能重复:
如何将new []与delete配对可能只会导致内存泄漏?
(POD)释放内存:删除[]等于删除?

使用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.
Run Code Online (Sandbox Code Playgroud)

但是,当删除"复杂"类型的数组时,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!!!
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 在第一个测试用例中,为什么deletedelete []在g ++下是一样的?
  2. 在第二个测试用例中,为什么g ++不像第一个测试用例那样处理它?

Pet*_*der 9

这完全取决于底层内存管理器.简而言之,C++要求您使用删除数组delete[]并删除非数组delete.标准中没有解释您的行为.

然而,可能发生的是delete p;简单地释放内存块p(无论是否是数组).另一方面,delete[]另外另外一个遍历数组的每个元素并调用析构函数.由于正常的数据类型,如char没有析构函数,有没有效果,所以deletedelete[]最终做同样的事情.

就像我说的,这是所有特定的实现.无法保证delete可以在任何类型的数组上工作.它恰好适用于您的情况.在C++中,我们称之为未定义的行为 - 它可能有效,可能不行,它可能会做一些完全随机和意外的事情.你最好避免依赖未定义的行为.


Naw*_*waz 6

char * a = new char[1024];
delete a; // the incorrect way. also NO memory leak.
Run Code Online (Sandbox Code Playgroud)

不,它没有保证No memory leak.它实际上调用了未定义的行为.


Nov*_*kov 1

因为那是未定义的行为。它不能保证会损坏,但也不能保证能正常工作。