Я хочу reset объект. Могу ли я сделать это следующим образом?
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] Но могу ли я явным образом называть деструктор, если я выделил свой объект с новым?
Часто задаваемые вопросы: вы не можете, если объект не был выделено с размещением нового. Объекты созданные новым, должны быть удалены, что делает две вещи (помните их): звонки деструктор, затем освобождает память.
FQA: Перевод: удаление - это способ явно называть деструктор, но он также освобождает память. Ты можешь также вызвать деструктор без освобождение памяти. Это уродливое и бесполезно в большинстве случаев, но вы можете сделать что.
Деструктор/вызов конструктора, очевидно, является нормальным кодом на С++. Гарантии, используемые в коде, напрямую вытекают из размещения новых гарантий. Это ядро стандартного, оно отличает твердую вещь. Как его можно назвать "грязным" и быть представленным как нечто ненадежное?
Считаете ли вы возможным, что внедрение новых и не-размещения новых отличается? Я думаю о какой-то больной возможности, что обычный новый может, например, поместить размер блока памяти, выделенного перед блоком, который, по-видимому, не будет делать в новом месте (поскольку он не выделяет никакой памяти). Это может привести к пробелу в некоторых проблемах... Возможна ли такая новая() реализация?