Appel destructeur et puis constructeur (réinitialisation d'un objet)

Je veux réinitialiser un objet. Puis-je le faire de la manière suivante?

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

Ce code est évidemment un sous-ensemble du cycle de vie typique d'un objet alloué par le placement de nouvelles:

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

La seule chose qui a changé, c'est l'ordre de constructeur et le destructeur des appels.

Alors, pourquoi dans le FAQ suivante
les menaces apparaissent?

[11.9] Mais ce que je peux appeler explicitement une
destructeur si j'ai alloué mon objet
avec de nouvelles?

FAQ: Vous ne pouvez pas, sauf si l'objet a été
alloués avec la mise en place de nouvelles. Les objets
créé par le nouveau doit être supprimée, ce qui
fait deux choses (rappelez-vous): appels
le destructeur, puis libère la mémoire.

FQA: Traduction: supprimer est un moyen de
explicitement appel d'un destructeur, mais il
aussi désalloue la mémoire. Vous pouvez
aussi appeler un destructeur sans
la désallocation de la mémoire. C'est moche et
inutile dans la plupart des cas, mais vous pouvez le faire
qu'.

Le destructeur/appel du constructeur est évidemment normal de code C++. Garanties utilisées dans le code directement le résultat de la dans le placement de nouvelles garanties. Il est la base de la norme, c'est solide comme le roc chose. Comment peut-il être appelé "sale" et être présenté comme quelque chose de fiable?

Pensez-vous que c'est possible, que le placement et le non-placement de la mise en œuvre de nouvelles sont-elles différentes? Je suis en train de réfléchir certains malades possibilité, que le nouveau peut par exemple mettre la taille du bloc de mémoire alloué avant le bloc, ce qui fait que le placement de nouveaux évidemment ne serait pas le faire (parce qu'il n'a pas d'allouer de la mémoire). Cela pourrait entraîner un écart pour quelques problèmes... Est nouveau() de la mise en œuvre possible?

Les gens vous disent que vous ne pouvez pas appeler le constructeur. Franchement, je n'ai jamais, jamais vu un constructeur appelé comme dans anObject->AnObject();, mais je ne sais pas la norme par coeur et n'ai pas regardé jusqu'à tant que je peux confirmer qu'il est interdit. Toutefois, si vous êtes sûr que c'est la base de la norme et solide, pourquoi me demandez-vous? Si vous êtes sûr qu'il signifie que vous avez testé votre code et il fonctionne, donc, si vous aimez cette solution, juste aller avec elle.
Je veux vérifier que je n'ai pas manqué de rien comme la dernière modification en question.

OriginalL'auteur | 2009-07-14