オブジェクトをリセットしたい。次のようにできますか?
anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();
このコードは明らかに、新しい配置で割り当てられたオブジェクトの典型的なライフサイクルのサブセットです。
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 にすべての脅威が表示されるのでしょうか。
[11.9]しかし、オブジェクトにnewを割り当てた場合、デストラクタを明示的に呼び出すことはできますか?
FAQ:オブジェクトが新しい配置で割り当てられていない限り、できません。newによって作成されたオブジェクトは削除する必要があります。これにより、2つのことが行われます(覚えておいてください)。デストラクタを呼び出してから、メモリを解放します。
FQA:変換:削除は、デストラクタを明示的に呼び出す方法ですが、メモリの割り当てを解除する方法でもあります。メモリの割り当てを解除せずにデストラクタを呼び出すこともできます。ほとんどの場合、醜くて役に立たないですが、それは可能です。
デストラクタ/コンストラクタの呼び出しは、明らかに通常のC++コードです。コードで使用される保証は、配置の新しい保証から直接生じます。それは標準の核心であり、堅実なものです。どうしてそれを「汚い」と呼び、信頼できないものとして提示することができますか?
newのインプレースメントと非インプレースメントの実装が異なる可能性があると思いますか?私はいくつかの病気の可能性について考えています。たとえば、通常のnewは、ブロックの前に割り当てられたメモリブロックのサイズを置くことができますが、インプレースメントのnewは明らかに(メモリを割り当てないため)行いません。これにより、いくつかの問題のギャップが生じる可能性があります...そのようなnew()の実装は可能ですか?