2016-02-12 44 views
7

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

其次,我敢肯定没有必要在将它设置为NULL并删除它之前检查指针是否为NULLas discussed here

if(m_pio) 
{ 
    m_pio = NULL; 
    delete m_pio; 
} 
+11

这是一个内存泄漏的实现......可能意外地将一条线向上或向下移动。 – dtech

+4

我的_guess_是这是一个糟糕的3路合并,一个快速和脏编辑,或某种未经审查的重构的结果。我自己犯了类似于此的错误,导致显然无意义的(但仍然有效)代码的来源只有在挖掘源代码历史记录后才显现出来。 –

+4

..他们甚至不需要if语句。删除null很好 –

回答

5

双删除对象可能导致析构函数被调用两次,所以有些人赞成删除之后将其设置为NULL。这可以防止在内存中调用析构函数,该内存可能已经从指针的先前内存地址重新分配。

如上所示,删除前设置为NULL是内存泄漏。没有内存泄漏固定码:

if(m_pio) { 
    delete m_pio; 
    m_pio = NULL; 
} 

请注意,调用(在C++ 11或nullptr)上NULL删除,是合法的,所以你的代码可能只是被写成这样,而不是:显然

delete m_pio; 
m_pio = NULL 
+0

我更喜欢设置一个删除指向NULL的指针作为调试帮助,所以我知道指针何时有效。防止双重删除或双重破坏是一个副作用。 –

+0

我在过去学过C++,但我现在重新学习的很多东西都是用'shared_ptr'或'unique_ptr'去做,如果你能避免这种开销的话。通过这些和移动语义,现在可以避免一些使用原始指针的情况。 – MtRoad

+0

我做同样的事情,当你需要的指针是一个可变大小的数组时,'vector'也是有用的。但是仍然有一些原始指针是有用的。 –

-1

我们无法辨别原作者的意图。

在一个侧面说明,你会在人我已经(甚至业内资深人士)的工作谁拥有在他们头上的量delete ING或free荷兰国际集团NULL是某种需要一件坏事惊讶被防范,despite that there are no consequences for it。它最终造成了一大堆不必要的检查,特别是当有问题的开发人员特别喜欢浪费时间手动管理内存时。

1

笔者想写:

delete m_pio; 
m_pio = NULL; 

但混乱的线条和有坏的错误。在delete之后指定NULL是保护变量的另一个好方法delete