Вызов деструктора, а затем конструктора (сброс объекта)

Я хочу сбросить объект. Могу ли я сделать это следующим образом?

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

Единственное, что изменилось, - это порядок вызовов конструктора и деструктора.

Итак, почему в следующий FAQ all the threatening appear?

[11.9] But can I explicitly call a destructor if I've allocated my object with new?

FAQ: You can't, unless the object was allocated with placement new. Objects created by new must be deleted, which does two things (remember them): calls the destructor, then frees the memory.

FQA: Translation: delete is a way to explictly call a destructor, but it also deallocates the memory. You can also call a destructor without deallocating the memory. It's ugly and useless in most cases, but you can do that.

Вызов деструктор / конструктор, очевидно, является нормальным кодом C ++. Гарантии, использованные в коде, являются прямым следствием введения новых гарантий. этоthe core of the standardэто надежная вещь. Как это можно назвать «грязным»? и быть представленным как нечто ненадежное?

Как вы думаете, возможно ли, что внедрение новых и их размещение по-разному? Я думаю о некоторой больной возможности того, что обычный new может, например, поместить размер блока памяти, выделенного перед блоком, что при размещении new, очевидно, не подойдет (потому что он не выделяет какую-либо память). Это может привести к разрыву для некоторых проблем ...Is such new() implementation possible?

Ответы на вопрос(10)

Ваш ответ на вопрос