以下代码仅用于说明我的问题。显式析构函数
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