Chame o destrutor e, em seguida, o construtor (reconfigurando um objeto)

Eu quero redefinir um objeto. Posso fazer da seguinte maneira?

anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();

Este código é obviamente um subconjunto do ciclo de vida típico de um objeto alocado por in placement 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

A única coisa que mudou é a ordem das chamadas do construtor e do destruidor.

Então, porque noseguindo a FAQtodas as ameaças aparecem?

[11,9] Mas eu posso chamar explicitamente um destruidor se eu aloquei meu objeto com novo?

FAQ: Você não pode, a menos que o objeto tenha sido alocado com o novo posicionamento. Os objetos criados pelo novo devem ser excluídos, o que faz duas coisas (lembre-se deles): chama o destruidor e libera a memória.

FQA: Translation: delete é uma forma de chamar explicitamente um destrutor, mas também desaloca a memória. Você também pode chamar um destrutor sem desalocar a memória. É feio e inútil na maioria dos casos, mas você pode fazer isso.

A chamada do destruidor / construtor é obviamente código C ++ normal. Garantias utilizadas no código resultam diretamente da colocação de novas garantias. Isto éo núcleo do padrãoé algo sólido. Como pode ser chamado de "sujo" e ser apresentado como algo não confiável?

Você acha que é possível que a implementação in-placement e non-in-placement de novos seja diferente? Estou pensando em alguma possibilidade doentia, que o novo regular pode, por exemplo, colocar o tamanho do bloco de memória alocado antes do bloco, o que obviamente não faria (obviamente, não aloca memória alguma). Isso pode resultar em uma lacuna para alguns problemas ...Essa nova () implementação é possível?

questionAnswers(10)

yourAnswerToTheQuestion