delete []是否会调用析构函数?

Mix*_*hos 11 c++ delete-operator

我正在编写一个模板类,它在内部管理给定类型的数组.像这样:

template<typename T>
class Example {
    // ...
private:
    T* objects; // allocated in c'tor (array), deleted in d'tor
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我想知道objects当我删除它时,C++是否会调用每个对象的析构函数delete[] objects;.

我需要知道这一点,因为我的类中的对象始终不包含合理的值,因此不应该在不执行时调用析构函数.

此外,我想知道,如果我宣布一个固定大小的数组像析构函数将被称为T objects[100]作为的一部分Example<T>.

hmj*_*mjd 21

如果T有一个析构函数,那么它将被调用delete[].从第5.3.5删除 c ++ 11标准(草案n3337),第6节:

如果delete-expression的操作数的值不是空指针值,则delete-expression将调用该对象的析构函数(如果有)或要删除的数组的元素.在数组的情况下,元素将按地址递减的顺序销毁(即,与构造函数完成的顺序相反;见12.6.2).

当数组未动态分配且数组超出范围(生命周期结束)时,T也将为数组中的每个元素调用类型的析构函数T[].


我需要知道这一点,因为我的类中的对象始终不包含合理的值,因此不应该在不执行时调用析构函数.

但是,对象可能会获得一个无法被破坏的状态,这似乎是一个非常重要的问题.


San*_*ker 5

是的,当使用 时,将会为数组中的所有对象调用析构函数delete[]。但这不应该成为问题,因为当您使用(您确实这样做了,对吧?)分配数组时,会为数组中的所有对象调用new[]构造函数。

如果构造的对象可能处于调用析构函数无效的状态,那么您的对象就存在严重错误。您需要使析构函数在所有情况下都能工作。