2013-06-27 66 views
8

我正在写一个模板类,它在内部管理给定类型的数组。就像这样:是否删除[]调用析构函数?

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

我在想,如果C++调用每个对象的析构函数中objects,当我通过delete[] objects;删除。

我需要知道这一点,因为在我的课的对象不包含有意义的值的时候,所以当他们不这样做的析构函数不应该被调用。

此外,我想知道如果我宣布像T objects[100]这样的固定大小的数组作为Example<T>的一部分,将会调用析构函数。

+14

“因为我班的对象始终不包含合理的值”这个班听起来很糟糕。 –

+0

该类是一个提前分配内存的集合,它并不总是使用它。我不需要用NULL来填充这个空格,因为这个类已经知道哪些元素正在使用,哪些不是。 – Mixthos

+0

如果'new []'调用构造函数,那么'delete []'调用析构函数是合乎逻辑的。这只是合乎逻辑的。 – dtech

回答

18

如果T有析构函数,然后它将被delete[]被调用。从部分5.3.5删除C++ 11标准的(草案n3337),第6:

如果删除表达式的操作数的值不是空指针值,删除 - 表达式将调用对象的析构函数(如果有的话)或被删除数组的元素。在 数组的情况下,元素将按照地址递减的顺序被销毁(也就是说,它们的构造函数完成 的反向顺序;见12.6.2)。

一类T析构也将被调用的在T[]阵列的每个元素时,阵列不是动态分配和数组超出范围(寿命结束)。


我需要知道这一点,因为在我的课的对象不包含有意义的值的时候,所以当他们不这样做的析构函数不应该被调用。

不过,似乎有一个对象可以获取它不能被破坏的状态非常显著的问题。

1

delete[] objects类似(但不相同):

for (i = 0; i < num_of_objects; ++i) { 
    delete objects[i]; 
} 

因为delete调用析构函数,你可以期望delete[]做同样的。

3

是的,当使用delete[]时,析构函数将被调用为数组中的所有对象。但是这不应该成为一个问题,因为当你使用new[](你没有,对吗?)分配它时,构造函数被调用了数组中的所有对象。

如果构造的对象可以在这种状态下调用析构函数将是无效的,那么有一些严重的问题你的对象。你需要让你的析构函数在任何情况下工作。

1

delete []确实为数组的每个元素调用析构函数。成员数组(您的T objects[100])也是如此。

你要保持它的指针,并设计析构函数(和拷贝构造函数和拷贝赋值运算符,见rule of three/five)为模板,以应对“非合理”值由objects指向。

2

答案是肯定的。调用每个对象的析构函数。

在相关说明中,应尽可能避免使用delete。代之以使用智能指针(例如,unique_ptr,shared_ptr)和STL容器(例如,std :: vector,std :: array)。

0

是的,delete[]保证每个对象都会调用析构函数。

根据您的使用情况,使用Boost pointer containers或者只是使用智能指针的容器,可能会使指针的收集(异常安全)变得更容易。

相关问题