是否有已发布指针的已建立指针值?

fre*_*low 6 c++ debugging pointers memory-management visual-studio-2008

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

delete ptr;
ptr = 0;
Run Code Online (Sandbox Code Playgroud)

如果有人试图再次释放指针,那么什么都不会发生.在我看来,这是错误的.在指针被释放后访问指针是一个错误,错误应尽快跳到你的脸上.

是否有一个替代值可以指定给指定已发布的指针的指针变量?

delete ptr;
ptr = SOME_MAGIC_VALUE;
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望Visual Studio 2008 在调试模式下告诉我" 程序已被终止,因为您试图在此处访问已发布的指针! ".


好吧,似乎我必须自己做检查.以下模板有什么问题吗?

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

Lig*_*ica 7

delete没有.如果你真的想要警告或错误的话,在尝试某事时测试"0" .

或者,在开发过程中,您可以省略ptr = 0;并依靠valgrind告诉您何时何地尝试双重免费.一定要放ptr = 0;回去发布.

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

我不是在暗示if (ptr != 0) delete ptr;.我在暗示if (ptr == 0) { some user error that the OP asked for } delete ptr;

  • @Nawaz:我*知道*这个.C++不需要它.但是如果他想在"删除0"之前向用户发出某种错误或警告 - 假设最终在这种情况下是一个错误的结果 - 那么,他可以做到这一点. (5认同)
  • 嗯..我现在明白了.:-) (2认同)

lia*_*iaK 5

NULL释放指针后分配.而且在使用它之前,检查NULL两者均..如果它为空,报告错误自己.

  • @Axel请以伪装的方式取出任何个人智慧.使用NULL非常好,并且当您想要将使用替换为nullptr时更容易转换.我在此声明我的个人智慧,并且更喜欢使用"0".但我不想把它当成事实.我知道它有一些缺点. (2认同)
  • -1提供可以促进错误和复杂性的建议.当您使指针为空时,您可以防止检测到多重删除错误.推理粗糙的代码错误将由一个谨慎的nullpointer检查,在该草率代码中检测,是无效的.所以推断指针的副本不存在.并且有效性检查到处都会增加复杂性,从而导致新的错误. (2认同)