c++ - 删除指针并检查地址

标签 c++ pointers visual-c++

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

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

最佳答案

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

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

如果您希望将其用于调试目的,我建议您使用一些替代技术。

如果你想知道指针是否被释放,你应该显式将它设置为0,稍后你可以将指针与0进行比较检查它是否被释放。

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

关于c++ - 删除指针并检查地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23589808/

相关文章:

c++ - 多重删除

C++ 避免或管理 MSVC 中的循环项目依赖

c - 指针解引用线程安全吗?

c# - 为什么这个 Explicit P/Invoke 不起作用?

c++ - vc++ mfc中串行编程的一些问题

c# - 如何使用 `#import` 和 `tlb` 文件从 C# 程序集在 C++ 中实现 COM 回调接口(interface)?

c++ - 如何将 C 风格的编译时数组转换为 std::array

c++ - 二叉搜索树的递归 bool 函数

c++ - 销毁并重新创建对象是否会使指向该对象的所有指针都无效?

c++ - 检查 char * 类型的字符串是否包含另一个字符串