このプログラムを検討してください。
int main()
{
struct test
{
test() { cout << "Hello\n"; }
~test() { cout << "Goodbye\n"; }
void Speak() { cout << "I say!\n"; }
};
test* MyTest = new test;
delete MyTest;
MyTest->Speak();
system("pause");
}
私はクラッシュを予期していましたが、代わりにこれが起こりました:
こんにちは
さようなら
私は言います!
これは、メモリが割り当て解除としてマークされている場合、物理的にワイプされておらず、コードがそれをすぐに参照しているため、オブジェクトは完全に無傷でそこに残っているためだと思います。呼び出す前に割り当てがSpeak()
多ければ多いほど、クラッシュする可能性が高くなります。
理由が何であれ、これは私の実際のスレッドコードの問題です。上記の場合、現在のスレッドがアクセスしたいオブジェクトを別のスレッドが削除したかどうかを確実に判断するにはどうすればよいですか?