删除一个类数组

时间:2012-04-18 21:19:39

标签: c++

以下是否会正确销毁所有内容(调用所有适当的析构函数并释放所有内存)?

Class* var[50];
var[0] = new SubClass();

delete[] *var;

相似
Class** var = new Class*[50];
var[0] = new SubClass();

delete[] var;

或者我应该迭代数组并删除每个单独的对象(这是我认为删除[]所做的)。

4 个答案:

答案 0 :(得分:3)

正确的方法是使用资源管理类,如std::vector<std::unique_ptr<MyClass>>。这将始终保证正确的资源清理,无需用户干预。任何看到deletenew[]delete[]的C ++代码都应该立即重构以避免它们 - 并且new应该再进行一次。

答案 1 :(得分:0)

Class* var[50];
var[0] = new SubClass();

delete[] *var;

这是未定义的行为。正确的方法是

delete var[0]; //equivalent to delete *var;

如果为数组的所有50个元素分配内存,则必须迭代并删除其中的每个元素。想一想:

  • 对于每个new,您应该有一个关联的delete
  • 每个new[]
  • ,您应该有一个关联delete[]
  • 不要将newdelete[]new[]delete混淆,因为这会导致未定义的行为

你的第二个片段是非法的C ++。

编辑由于你显然是初学者,让我们稍微分解一下。由于第二个片段甚至没有编译,我将专注于第一个:

Class* var[50];

这声明了一个指向Class的50个指针的数组。指针悬空 - 它们未初始化,并且未创建Class个对象。

var[0] = new SubClass();

这为SubClass对象分配内存并分配数组中的第一个指针。所有其他指针仍未初始化。

*var;

返回第一个元素,即Class*。它相当于var[0]

delete[] *var;

尝试在delete[]上调用Class*,该new已分配{{1}},因此会导致未定义的行为。

答案 2 :(得分:0)

delete[]用于动态分配的数组。它对应new []

摘自C ++开放标准(3.7.4.2)

  

如果通过抛出异常终止释放函数,则   行为未定义。提供给a的第一个参数的值   deallocation函数可以是空指针值;如果是的话,如果是的话   解除分配函数是标准库中提供的函数   通话没有效果。否则,提供给操作员的值   标准库中的delete(void *)应为其中一个值   通过先前调用运算符 new(std :: size_t)返回   或标准中的运算符new(std :: size_t,const std :: nothrow_t&amp;)   库,以及提供给操作员删除[](void *)的值   标准库应该是前一个返回的值之一   调用运算符 new [](std :: size_t)或运算符   标准库中的new [](std :: size_t,const std :: nothrow_t&amp;)。

您的第一个示例不使用new [],因此您不应该使用delete [] !!!

答案 3 :(得分:-2)

for(int i = 0; i < 50;i++)delete var[i];
delete[] var;