在Visual C ++程序中,我在指针上调用delete
。我稍后需要检查指针是否已被删除。我注意到Visual C ++会将地址设置为0x00000000
,但稍后该值可能会更改为0xABABABAB
,0xFEEEFEEE
或some other value之类的内容。检查NULL
仅适用于0x00000000
地址。
是否有一种可靠的方法可以检查指针是否被删除,无论地址可能经历这些更改?
答案 0 :(得分: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
...
}
答案 1 :(得分:0)
如果您使用C ++ 11,您只需将指针的值设置为nullptr
并在之后测试(例如if (foo == nullptr)
)。