2014-01-06 50 views
0

我有一些內存密集型代碼,然後下面的語句解放出來一個空指針的原因如下彈出消息

free(array1); // array1 is NULL 

我基本上是所謂的自由在一個空指針。這是我的理解,意外地在空指針上釋放是安全的。但是,當執行自由語句時,我彈出了以下消息。

「Windows在app.exe中觸發了一個斷點 這可能是由於堆的損壞,這表示app.exe或它已加載的任何DLL中存在一個錯誤。

這是否意味着免費是不安全的調用NULL指針,或者這是一個跡象,可能是我的程序中的內存問題?

當我取消註釋空閒語句時,一切正常。

+2

爲什麼你使用免費'在C++中,而不是'新/刪除'? –

+0

數組如何可以爲空:/ –

回答

4

在NULL指針上調用free()絕對安全,因此您必須早先損壞您的堆。也就是說,爲了保證在崩潰之前array1真的是NULL,可能需要使用print語句。如果你不能發現錯誤,你可能不得不求助於工具來幫助你 - 關於這種堆使用驗證工具有很多問題。

支持文檔:您在Windows上,但API是使用C語言標準化的:請參閱「如果ptr爲NULL,則不執行任何操作。」在http://linux.die.net/man/3/free

當然,你應該檢查new/new[]/malloc - 或 - realloc得以妥善delete/delete[]/realloc - 或 - free到處配對。有理由在C++中使用malloc/free,但最明顯的是與C代碼的互操作性,並且偶爾會出現realloc就地增長的潛在性能優勢。

「當我取消註釋免費聲明時,一切正常。」 - 最好不要依賴那個......如果你的程序濫用了堆,它可能隨時崩潰,例如,一些運行,而不是其他人,在你的代碼中任何地方最微小的看似無關的變化後,更改編譯器標誌,無害的輸入更改,或甚至在另一臺PC上部署相同的可執行文件...

+1

您可能會添加free()不是將指針設置爲NULL(我認爲這是由原始海報推測的)。 – PTwr

+0

@PTwr:一個有用的評論,但不確定多麼相關...... OP應該考慮。 –