スタック変数の代入を上書きする前にデストラクタが呼び出されたかどうかを確認するテストを作成しましたが、結果の合理的な説明が見つかりません...
これは私のテストです (Visual C++ 2008 リリース モードで):
#include <iostream>
class C {
public:
char* ptr;
C(char p) { ptr = new char[100]; ptr[0] = p;}
~C() { std::cout << ptr[0] << ' '; delete [] ptr; }
};
int _tmain(int argc, _TCHAR* argv[])
{
{
C s('a');
s = C('b');
s = C('c');
s = C('d');
}
std::cin.get();
return 0;
}
仮説が正しければ「abcd」、偽であれば「d」を期待していました。代わりに「bcdx」が表示されます。「x」は、ランダムなヒープ値を読み取っていることを示す ptr に割り当てられているメモリの量に応じて変化します。
何が起こっていると思いますか(間違っている場合は修正してください)、各コンストラクター呼び出しが新しいスタック値を作成し(それらをs1、s2、s3、s4と呼びましょう)、割り当てによってs1.ptrがs4.ptrによって上書きされたままになります. s4 はコピーの直後に破棄されますが、s1 (ダングリング ptr を含む) はスコープを離れると破棄され、s4.ptr が二重に削除され、元の s1.ptr は削除されません。
shared_ptrs の使用を伴わない、この役に立たない動作を回避する方法はありますか?
編集: 「削除」を「削除 []」に置き換え