私はすでにスタック上に作成されたオブジェクトの新しい配置するだろう場合:配置新しいオーバーライドし、既存のオブジェクト
struct s{
s() { std::cout << "C\n";}
~s() { std::cout << "D\n";}
};
int main() {
s s1[3];
for(int i=0; i< 3; ++i)
s* newS = new (&s1[i]) s();
}
を私が手:
C
C
C
C
C
C
D
D
D
は、だから我々は最初の3つのオブジェクトのデストラクタを取得されていませんそれは安全ですか?ヒープ/スタックに割り当てられたオブジェクトのメモリをオーバーライドするだけで、そのオブジェクトがデストラクタでリソースを解放する必要がない場合でも安全ですか?
私はあなたがスタック上に3つのオブジェクトを作成している、これは間違っているどのように表示されていない、あなたはそれらの3のコンストラクタを取得する - そしてあなたは再作成するための新しい配置を使用します3つのオブジェクトを再び同じ場所に置くと、3つのコンストラクタが再び得られ、最後に3つのデストラクタが得られます。あなたは何か違うことを期待していますか? –
一般的に言えば、それは安全ではありません。基本ストレージを再利用する前に、構築されたオブジェクトを明示的に破棄する必要があります。 –
非常に安全ではありません - デストラクタが呼び出されるのは、新しい3つの配置で作成された3つのオブジェクトではなく、元の3つのオブジェクトです。これは驚きを引き起こす可能性があります。 –