在Visual C++程序中,我在指针上调用delete
。我稍后需要检查指针是否已被删除。我注意到Visual C++会将地址设置为0x00000000
,但后来该值可能会更改为诸如0xABABABAB
,0xFEEEFEEE
或some other value之类的内容。检查NULL
只适用于0x00000000
地址。删除指针和检查地址
有没有一种可靠的方法可以检查指针是否被删除,而不管这些地址可能会发生什么变化?
在Visual C++程序中,我在指针上调用delete
。我稍后需要检查指针是否已被删除。我注意到Visual C++会将地址设置为0x00000000
,但后来该值可能会更改为诸如0xABABABAB
,0xFEEEFEEE
或some other value之类的内容。检查NULL
只适用于0x00000000
地址。删除指针和检查地址
有没有一种可靠的方法可以检查指针是否被删除,而不管这些地址可能会发生什么变化?
如果你正在删除一个指向对象的指针,你可以看到析构函数。如果您想知道是否执行了无记忆操作,则没有可靠/便携的方式来了解这一点。内存管理依赖于实现。即使这样也有可能释放记忆被图书馆推迟。但是你应该永远相信delete
永远不会失败。如果你没有超载delete operator
,你可以依靠内存将被释放的库。
关于内存内容,内容被释放后,您不应该访问它们,因为行为是未定义的。
如果你想要这个用于调试目的,我会建议使用一些替代技术。
如果您想知道指针是否已释放,您应该explicitly
将其设置为0
,然后您可以稍后与0
比较指针以检查它是否已释放。
if (...) {
delete ptr;
ptr = 0; // set explicitly
}
...
if(0 == ptr) {
// Pointer was freed
...
} else {
// Pointer was not freed
...
}
如果您使用C++ 11,您可以将指针的值设置为nullptr
并在之后测试(例如if (foo == nullptr)
)。
为什么是-1?我不明白为什么这是错的。每个人都不太熟悉C++ 11标准。 – josaphatv
@josaphatv我认为这是非常明显的。所以在这里:这不是C++ 11的特定问题(在C++ 03中也可以达到同样的效果),并且在任何情况下它都不能回答这个问题。 OP需要删除的指针指向一些可识别的地址,这意味着他们不想手动设置指针。 – juanchopanza
有没有可靠的,便携的方式来做到这一点在标准的C + +。 – juanchopanza
你不能依赖这样的事情来决定是否在指针上调用了delete。 –
我希望这个问题可以帮助你http://stackoverflow.com/questions/4990462/what-happens-to-an-address-after-delete-operator-has-been-applied-to-it-in-c – WileTheCoyot