Правильное использование нового размещения и явного вызова деструктора

В недавнем интервью меня попросили ответить, безопасен ли этот код и когда я буду использовать что-то вроде этого:

template<class T> T *CTricky<T>::Safe_Or_Not (T *object) 
{ 

    object->T::~T (); 

    ::new (object) T; 

    return object; 

 }

Мой ответ был: этот код безопасен, и я бы использовал эту технику, если бы мне нужно было освободить ресурсы, используемые моим «объектом», вызвав его деструктор, но в то же время я не хотел освобождать свой «объект» и хотел он удерживает свое место в памяти (достигается размещением здесь new).

Честно говоря, я не ищу помощи, чтобы правильно ответить на этот вопрос на собеседовании. Мне только любопытно узнать, правильно ли я понимаю размещение новых и явных вызовов деструктора.


person DigitalEye    schedule 12.02.2014    source источник
comment
Возможно связано.   -  person Kerrek SB    schedule 12.02.2014
comment
Вот почему для утилизации пространства (и всего остального!) Для объектов семантика перемещения просто великолепна.   -  person Mark Garcia    schedule 12.02.2014


Ответы (3)



Короткий ответ: хотя это не обязательно вызывает проблемы, сделать это действительно безопасно довольно сложно. Самая большая проблема заключается в том, что если конструктор вызывается через новые броски размещения, вы уже уничтожили объект, но затем раскрутка стека попытается уничтожить его снова, что приведет к неопределенному поведению.

Хотя есть еще несколько вещей, на которые следует обратить внимание (например, нулевой указатель), который, вероятно, является наименее очевидным и наиболее сложным для предотвращения возникновения проблем (в основном, ваш единственный выбор - мириться с неопределенным поведением и надеяться на лучшее или поймать исключение и выйти из программы до того, как может произойти раскручивание стека).

person Jerry Coffin    schedule 12.02.2014

Я думаю, что общая логика «явный вызов деструктора + размещение нового» безопасна.
Однако этот код небезопасен, потому что:
- Вы не проверяете, является ли указатель нулевым. - Исключительная безопасность не учитывается

person Martin J.    schedule 12.02.2014