2016-02-12 50 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