c++ - 删除数组时delete和delete[]是一样的吗?

标签 c++ arrays memory-management g++

<分区>

Possible Duplicates:
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++ 上测试过它。

似乎 deletedelete [] 在删除“简单”类型的数组时效果相同。

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!!!

我的问题是:

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

最佳答案

这完全取决于底层内存管理器。简单地说,C++ 要求您使用 delete[] 删除数组,使用 delete 删除非数组。标准中没有对您的行为进行解释。

不过,delete p; 可能会释放从 p 开始的内存块(无论它是否为数组)。另一方面,delete[] 还会遍历数组的每个元素并调用析构函数。由于像 char 这样的普通数据类型没有析构函数,因此没有任何效果,所以 deletedelete[] 最终会做同样的事情.

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

关于c++ - 删除数组时delete和delete[]是一样的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6953457/

相关文章:

c++ - 指向成员函数的指针数组 : make it work

c++ - 迭代器问题

javascript - 函数中的参数是否会改变 Js 中的内存使用量或速度使用量

c# - 为什么创建新数组会抛出 OutOfMemoryException?

c++ - 调用模板参数的构造函数

c++ - 命名空间菜鸟问题 : two cpp files sharing the same namespace have the same variable

c++ - DirectX 10 中多重采样的操作顺序

c++ - 按光栅顺序阅读?

javascript - While 循环逻辑

sorting - 优化redis排序集内存使用