2015-04-02 21 views
3

我是Qt應用程序的新成員,使用C++。我正在檢查崩潰報告,我在Qt應用程序中創建了一個異常,但它繞過了語句併成功執行。爲什麼Qt應用程序不會給我例外或錯誤?

我產生了錯誤,如:

int *ptr; 
delete ptr; 
delete ptr; 

但它並沒有產生任何錯誤或異常。

任何人都可以告訴我這是什麼原因嗎?

+1

其可能'ptr'包含'0'。 – Galik 2015-04-02 08:02:13

+2

執行該操作時,程序不需要執行任何操作,因爲它是未定義的。 – molbdnilo 2015-04-02 08:02:21

+2

http://en.wikipedia.org/wiki/Undefined_behavior – ManuelH 2015-04-02 08:04:23

回答

1

刪除一個未初始化的指針只是未定義的行爲,所以它不需要給你任何錯誤消息 - 事實上它可以讓你訂購比薩餅。
雖然我很驚訝編譯器至少不會產生警告。這應該很容易診斷。

5

C++遵循的原則是「你不支付你沒有要求的東西」。這意味着,如果Java和C#等語言在發生錯誤時執行大量運行時檢查並引發定義良好的異常,則C++不會這樣做。在很多情況下,它只是說「如果你做了非法的事情,程序的行爲將會不明確」,並且將其放在那裏。未定義的行爲意味着允許任何事情發生—該程序被允許崩潰,似乎工作,訂購在線披薩。

刪除未初始化的指針或未由new分配的內容恰恰就是這樣一種未定義的行爲誘導操作。在這種情況下,不給你一個明確的錯誤完全符合程序的權利。不過,你的堆可能會被損壞而無法修復。

而且,你的具體情況,有當代碼實際上將被明確—如果ptr值爲null 一個條件。在空指針上使用delete是完全有效的,結果是空操作。這種初始化自動發生在全局變量上,一些編譯器在調試版本中爲局部變量以及執行。

相關問題