考虑这个程序:
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()
越多,崩溃的可能性就越大。
不管是什么原因,这对于我的实际线程代码来说都是一个问题。鉴于上述情况,我如何可靠地判断另一个线程是否删除了当前线程想要访问的对象?