2013-06-27 63 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或者只是使用智能指針的容器,可能會使指針的收集(異常安全)變得更容易。

相關問題