以下代碼僅用於說明我的問題。顯式析構函數
template<class T>
class array<T>
{
public:
// constructor
array(cap = 10):capacity(cap)
{element = new T [capacity]; size =0;}
// destructor
~array(){delete [] element;}
void erase(int i);
private:
T *element;
int capacity;
int size;
};
template<class T>
void class array<T>::erase(int i){
// copy
// destruct object
element[i].~T(); ////
// other codes
}
如果我有array<string> arr
在main.cpp中。當我使用erase(5)
時,element[5]
的對象被破壞,但是element[5]
的空間不會被釋放,我可以使用element[5] = "abc"
在這裏放置一個新值嗎?或者我是否必須使用貼裝新功能將新的價值放在element [5]
的空間中?
程序結束時,arr<string>
將調用它自己的析構函數,該函數也調用delete [] element
。因此,字符串的析構函數將運行以首先銷燬該對象,然後釋放該空間。但是因爲我已經明確地破壞了element[5]
,那麼析構函數(被arr的destuctor調用)運行兩次以破壞element[5]
?我知道這個空間不能被釋放兩次,這個對象怎麼樣?我做了一些測試,發現它看起來很好,如果我只是破壞對象兩次而不是釋放空間兩次。
更新
的答案是:
(1)I have to use placement new if I explicitly call destructor.
(2) repeatedly destructing object is defined as undefined behavior which may be accepted in most systems but should try to avoid this practice.
這是一個不好的方法。調用析構函數兩次爲未定義的行爲,其中「看起來很好」是完全可以接受的結果。不過,這並不好。無論如何,儘管陣列中的「擦除」對我來說毫無意義。 – GManNickG 2011-02-04 02:03:02
我同意@GMan:從數組中刪除元素意味着什麼?你想模仿C++`std :: vector`實現嗎?如果是這樣,你是否將刪除元素之後的所有元素移動到「填充空洞」? – 2011-02-04 02:05:42
@ Gman:「擦除」對我來說也沒什麼意義。 – Sean 2011-02-04 02:22:04