C++ 调用析构函数后悬空的指针

C++ 调用析构函数后悬空的指针,c++,pointers,C++,Pointers,我经历了这一切,并产生了怀疑。在析构函数中为对象的元素设置空值是一种好的做法吗? 当对象超出作用域时,将调用析构函数,但需要在析构函数中将其元素设置为NULL,以确保不留下悬空指针。无需在析构函数中将成员元素设置为NULL,因为已对所有者对象调用了delete,以便调用该析构函数。删除对象的代码有责任不再尝试访问该对象的内容 您还使用了额外的周期来清除内存。这样做的目的是在出现编程错误时提供确定性行为 如果使用已删除的指针,则程序在取消对nullptr的引用时将始终失败。不允许程序继续。 如果删

我经历了这一切,并产生了怀疑。在析构函数中为对象的元素设置空值是一种好的做法吗?
当对象超出作用域时,将调用析构函数,但需要在析构函数中将其元素设置为NULL,以确保不留下悬空指针。

无需在析构函数中将成员元素设置为NULL,因为已对所有者对象调用了delete,以便调用该析构函数。删除对象的代码有责任不再尝试访问该对象的内容


您还使用了额外的周期来清除内存。

这样做的目的是在出现编程错误时提供确定性行为

如果使用已删除的指针,则程序在取消对nullptr的引用时将始终失败。不允许程序继续。 如果删除的指针设置为nullptr,然后再次删除,则第二次尝试是设计上的noop。 这是析构函数中未删除的指针的正常模式。聪明的指针是你的朋友,完全避免这种情况


在析构函数中为已删除成员指针置零的目的不太明显;当怀疑其他代码可能引用该成员时。通常应该避免依赖于此,因为一旦回收了已破坏类的内存,它的实用性就会受到限制。尽管依赖于实现,但在许多环境中,当被删除的内存被重新使用时,内存的寿命足以导致程序失败,因此程序员可以找到问题并解决它。

对象被销毁后,它就不再存在了。当这些值将立即不存在时,将其成员设置为特定值是没有意义的

删除指针指向的对象时将指针设置为NULL的模式是有害的,并且在过去导致了错误。除非有特定的原因需要将指针设置为NULL(例如),否则以后可能会针对NULL进行测试,但不应将其设置为NULL

考虑:

Foo* foo getFoo();
if (foo!=NULL)
{
    do_stuff();
    delete foo;
}
// lots more code
return (foo == NULL);
现在,想象一下如果有人添加foo=NULL;删除foo后;在这段代码中,认为你应该这么做。现在代码将给出错误的返回值

接下来,考虑一下:

Foo* foo getFoo();
Foo* bar = null;
if (foo != NULL)
{
    bar = foo;
    do_stuff(bar);
    delete bar;
    bar = NULL;
}
// lots more code
delete foo;
我们总是在删除指针后将其设置为NULL,因此这会删除foo;一定很安全吧?显然不是。因此,在删除指针后将其设置为NULL既不必要也不充分


不要这样做。

为什么要在程序中使用原始指针?应该使用不属于自己的原始指针。但是,在大多数情况下,现在最好使用“裸”新建或删除。这些周期不应引起关注,因为在大多数情况下,在等待CPU提取时,这些CPU周期将被浪费,特别是在缓存未命中的情况下。我指的是对成员指针的引用。另一种常见的问题,不是这个问题的一部分:是C++代码的包装。因此,指针在C++代码中定义,它将通过将句柄指针传递给指针来初始化,该指针具有用于分配和释放它的原语。它们通过提供这样的句柄来工作。编辑:此评论是对其他人的评论的回应,该评论已被删除。