Следующий код используется только для иллюстрации моего вопроса.Явный деструктор
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), запускается дважды, чтобы уничтожить element[5]
? Я знаю, что пространство не может быть освобождено дважды, как насчет объекта? Я сделал несколько тестов и обнаружил, что это кажется прекрасным, если я просто уничтожу объект дважды, а не освобождая место дважды.
Update
Ответы:
(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
Я согласен с @GMan: что значит «стирать» элементы из массива? Вы пытаетесь эмулировать реализацию C++ 'std :: vector'? Если да, перемещаете ли вы все элементы после стираемого элемента до «заполнить отверстие»? –
@ Gman: «стереть» не имеет для меня никакого смысла. – Sean