删除指针和检查地址

时间:2014-05-11 06:49:56

标签: c++ pointers visual-c++

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

是否有一种可靠的方法可以检查指针是否被删除,无论地址可能经历这些更改?

2 个答案:

答案 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))。