C++ 删除前将指针设置为NULL

C++ 删除前将指针设置为NULL,c++,pointers,C++,Pointers,所以我偶然发现了这段代码,虽然我已经用C/C++编写了大约5年了,但我不明白为什么有人会想这么做。我理解在释放内存后为什么要将指针设置为NULL,但我当然不理解为什么会有人想做相反的事情(在我看来,这就像是内存泄漏) 其次,我非常确定在将指针设置为NULL并删除它之前,不必检查指针是否为NULL 双重删除一个对象会导致析构函数被调用两次,因此有些人喜欢在删除后将其设置为NULL。这可以防止在内存上调用析构函数,而该内存本可以从指针以前的内存地址重新分配 但是,如图所示,删除前设置为NULL是内存

所以我偶然发现了这段代码,虽然我已经用C/C++编写了大约5年了,但我不明白为什么有人会想这么做。我理解在释放内存后为什么要将指针设置为
NULL
,但我当然不理解为什么会有人想做相反的事情(在我看来,这就像是内存泄漏)

其次,我非常确定在将指针设置为NULL并删除它之前,不必检查指针是否为NULL


双重删除一个对象会导致析构函数被调用两次,因此有些人喜欢在删除后将其设置为
NULL
。这可以防止在内存上调用析构函数,而该内存本可以从指针以前的内存地址重新分配

但是,如图所示,删除前设置为
NULL
是内存泄漏。修复了无内存泄漏的代码:

if( m_pio ) {
    delete m_pio;
    m_pio = NULL;
}
请注意,在
NULL
(或C++11中的
nullptr
)上调用delete是合法的,因此您可以这样编写代码:

delete m_pio;
m_pio = NULL

显然,我们无法辨别原作者的意图


另一方面,你会惊讶于与我共事的人(甚至是行业老手)的数量,他们认为
delete
ing或
free
ing
NULL
在某种程度上是一件需要警惕的坏事。它只会导致大量不必要的检查,尤其是当开发人员特别喜欢浪费时间手动管理内存时。

作者想写:

delete m_pio;
m_pio = NULL;

但是把线路弄乱了,有个坏虫子。在
delete
之后分配
NULL
是保护变量不受另一个
delete
影响的好方法,这是一个内存泄漏实现。。。可能是不小心上移或下移了一行。我猜这是一个错误的三方合并、快速而肮脏的编辑或某种未经审查的重构的结果。我自己也犯过类似的错误,导致代码显然是毫无意义的(但仍在运行),其起源只有在挖掘源代码历史之后才明显。。。而且他们甚至不需要
if
语句。删除null是错误的fine@audiFanatic-有很多“专业级”软件,代码库非常糟糕。与我所看到的暴行相比,这算不了什么。@TejasPawar:如果
m_pio=NULL
delete
之后,那么它将阻止double
delete
成功。但事实上,这只是内存泄漏。我更喜欢将已删除的指针设置为NULL作为调试辅助,这样我就可以知道指针何时有效。防止双重删除或双重破坏是一个副作用。我以前学习过C++,但是现在我正在学习的大部分内容是与<代码> SyddypTr> <代码>或<代码> UnQuyGyPTR >,如果您可以避免开销。有了这些和移动语义,我以前使用原始指针的一些情况现在可以避免了。我也做了同样的事情,
vector
也很有用,因为指针只需要一个可变大小的数组。不过,在MarkRansom,我还是同意,接近金属是我们为什么用C++编写的。但它也是为了保护您的更高级别设计而设计的,这就是为什么我说“某些情况”;)我通常会在图形代码中遇到原始指针。
delete m_pio;
m_pio = NULL;