Я хочу сбросить объект. Могу ли я сделать это следующим образом?
anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();
Этот код, очевидно, является подмножеством типичного жизненного цикла объекта, выделенного в месте размещения new:
AnObject* anObject = malloc(sizeof(AnObject));
anObject = new (anObject) AnObject(); // My step 2.
// ...
anObject->~AnObject(); // My step 1.
free(anObject)
// EDIT: The fact I used malloc instead of new doesn't carry any meaning
Единственное, что изменилось, это порядок вызовов конструктора и деструктора.
Итак, почему в следующих часто задаваемых вопросах появляются все угрозы?
[11.9] Но могу ли я явно вызвать деструктор, если я разместил свой объект с помощью new?
FAQ: Нельзя, если только объект не был выделен с размещением new. Объекты, созданные new, должны быть удалены, что делает две вещи (запомните их): вызывает деструктор, а затем освобождает память.
FQA: Перевод: удаление — это способ явного вызова деструктора, но он также освобождает память. Вы также можете вызвать деструктор без освобождения памяти. В большинстве случаев это некрасиво и бесполезно, но вы можете это сделать.
Вызов деструктора/конструктора, очевидно, является обычным кодом C++. Гарантии, используемые в коде, являются прямым результатом размещения новых гарантий. Это ядро стандарта, это надежная вещь. Как его можно назвать "грязным" и представить чем-то ненадежным?
Как вы думаете, возможно ли, что реализация new на месте и без места отличается? Я думаю о какой-то больной возможности, что обычный новый может, например, указать размер блока памяти, выделенного перед блоком, чего, очевидно, новый на месте не сделает (потому что он не выделяет никакой памяти). Это может привести к возникновению пробела для некоторых проблем... Возможна ли такая реализация new()?