以下是否会正确销毁所有内容(调用所有适当的析构函数并释放所有内存)?
Class* var[50];
var[0] = new SubClass();
delete[] *var;
与
相似Class** var = new Class*[50];
var[0] = new SubClass();
delete[] var;
或者我应该迭代数组并删除每个单独的对象(这是我认为删除[]所做的)。
答案 0 :(得分:3)
正确的方法是使用资源管理类,如std::vector<std::unique_ptr<MyClass>>
。这将始终保证正确的资源清理,无需用户干预。任何看到delete
,new[]
或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[]
new
与delete[]
和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;