删除已删除的对象:行为?

Jér*_*eil 8 c++ pointers memory-management delete-operator

我想知道如果我尝试对delete已经删除的指针执行操作,或者可能尚未分配,会有什么问题?我读过两件事:第一,delete操作员会做一些检查,我们不需要检查指针是否为空; 然后,我读到它可能导致未知的行为..

我问它,因为我使用了一些包含Qt对象属性的个人对象; 我认为Qt会删除关闭窗口时关联的所有小部件,但我不确定并且仍然如此:如果在窗口关闭之前软崩溃,我们必须手动删除所有对象.

那么,最好的解决方案是什么?那样的东西?

if( my_object )
    delete my_object;
Run Code Online (Sandbox Code Playgroud)

它能避免危险的行为吗?

sha*_*oth 17

delete在已经delete非空的指针上是未定义的行为 - 您的程序可能会崩溃.您可以安全地使用delete空指针 - 它将产生一个无操作.

所以真正的问题不delete在于空指针.真正的问题在这里:

 ptr = new Something();
 otherPtr = ptr;
 delete ptr;
 delete otherPtr;
Run Code Online (Sandbox Code Playgroud)

如果你有几个指向同一个对象的指针并且它非常危险,就会发生这种情况.可能的解决方案是:

  • 使用智能指针(delete代码中没有)或
  • 只有一个指定的指针,用于控制每个对象的生命周期,并delete在恰当的时间.

  • "可能崩溃"是轻描淡写的,UB可以让猛禽跳过你的窗户,让宇宙崩溃. (6认同)