2014-05-11 60 views
0

在Visual C++程序中,我在指针上调用delete。我稍后需要检查指针是否已被删除。我注意到Visual C++会将地址设置为0x00000000,但后来该值可能会更改为诸如0xABABABAB0xFEEEFEEEsome other value之类的内容。检查NULL只适用于0x00000000地址。删除指针和检查地址

有没有一种可靠的方法可以检查指针是否被删除,而不管这些地址可能会发生什么变化?

+1

有没有可靠的,便携的方式来做到这一点在标准的C + +。 – juanchopanza

+0

你不能依赖这样的事情来决定是否在指针上调用了delete。 –

+0

我希望这个问题可以帮助你http://stackoverflow.com/questions/4990462/what-happens-to-an-address-after-delete-operator-has-been-applied-to-it-in-c – WileTheCoyot

回答

2

如果你正在删除一个指向对象的指针,你可以看到析构函数。如果您想知道是否执行了无记忆操作,则没有可靠/便携的方式来了解这一点。内存管理依赖于实现。即使这样也有可能释放记忆被图书馆推迟。但是你应该永远相信delete永远不会失败。如果你没有超载delete operator,你可以依靠内存将被释放的库。

关于内存内容,内容被释放后,您不应该访问它们,因为行为是未定义的。

如果你想要这个用于调试目的,我会建议使用一些替代技术。

如果您想知道指针是否已释放,您应该explicitly将其设置为0,然后您可以稍后与0比较指针以检查它是否已释放。

if (...) { 
    delete ptr; 
    ptr = 0; // set explicitly 
} 
... 
if(0 == ptr) { 
    // Pointer was freed 
    ... 
} else { 
    // Pointer was not freed 
    ... 
} 
0

如果您使用C++ 11,您可以将指针的值设置为nullptr并在之后测试(例如if (foo == nullptr))。

+0

为什么是-1?我不明白为什么这是错的。每个人都不太熟悉C++ 11标准。 – josaphatv

+0

@josaphatv我认为这是非常明显的。所以在这里:这不是C++ 11的特定问题(在C++ 03中也可以达到同样的效果),并且在任何情况下它都不能回答这个问题。 OP需要删除的指针指向一些可识别的地址,这意味着他们不想手动设置指针。 – juanchopanza