c++ - 是否有已释放指针对象的既定指针值?

标签 c++ visual-studio-2008 debugging pointers memory-management

一些程序员喜欢在释放指针对象后将指针变量设置为空:

delete ptr;
ptr = 0;

如果有人再次尝试释放指针对象,则不会发生任何事情。在我看来,这是错误的。在指针对象被释放后访问指针是一个错误,错误应该尽快跳到你的面前。

是否可以将替代值分配给指定已释放指针对象的指针变量?

delete ptr;
ptr = SOME_MAGIC_VALUE;

理想情况下,我希望 Visual Studio 2008 在 Debug模式下告诉我“程序已终止,因为您试图访问此处已发布的指针对象!”。


好吧,看来我得自己检查了。以下模板有什么问题吗?

template <typename T>
void sole_delete(T*& p)
{
    if (p)
    {
        delete p;
        p = 0;
    }
    else
    {
        std::cerr << "pointee has already been released!\n";
        abort();
    }
}

最佳答案

没有。如果您真的想发出警告或出错,则在尝试删除 某些内容时测试“0”。

或者,在开发过程中,您可以省略 ptr = 0; 并依靠 valgrind 告诉您何时何地尝试双重释放。只需确保将 ptr = 0; 放回原处即可。

编辑 是的,我认识的人 C++ 不需要围绕 delete 0 进行测试;

我并不是在建议 if (ptr != 0) delete ptr;。我建议 if (ptr == 0) { OP 要求的一些用户错误 } delete ptr;

关于c++ - 是否有已释放指针对象的既定指针值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4746679/

相关文章:

c++ - SDL 的 LNK 2019 错误

c++ - 该声明的含义 count[array[i]]

c++ - 来自 QVariantList 的 std::function 的通用调用

c# - 为什么跳转到 WPF for Business Application 而不是使用 Winforms

visual-studio-2008 - 在 Windows 7 x64 中找不到 VS2008 installdir 注册表

c - 无法打开 'libc-start.c'

c# - 从 Visual Studio 启动时,WPF 应用程序加载初始窗口的速度非常慢

c++ - 如何将 std::array 转换为一个点?

找不到输入文件 'libc.lib'

c# - 计算机重命名后调试