2010-06-18 36 views
9

我想知道是否有趕在C++這樣的錯誤的可能性:我可以在C++中捕獲錯誤的指針錯誤嗎?

object* p = new object; 

delete p; 
delete p; // This would cause an error, can I catch this? 
  1. 我可以檢查指針是否有效?
  2. 我能捕捉到一些異常嗎?

我知道我可以在第一次刪除對象後將指針p設置爲NULL。但是想象一下你不會這麼做。

+5

問題不在於如何從這些錯誤中恢復,問題是如何不讓他們擺在首位。 (對於設置指向NULL的指針也是一樣的,爲什麼指向範圍的指針並不是指什麼?)C++帶有許多阻止你手動管理指針(和其他資源)的構造。在做C++的最後十年中,我很少需要手動「刪除」任何東西。 – sbi 2010-06-18 07:59:13

+0

@工作權你是 - 應該拉起參考。 – 2010-06-18 08:01:17

回答

10

我不認爲你可以捕獲這種類型的錯誤,因爲我想結果是不確定的行爲。它可能什麼也不做,它可能會崩潰,它可能會損壞內存,並導致後續問題。

如果你發現它沒有具體的事情與您當前的編譯器,你可以嘗試並處理,但是當你升級編譯器版本,可能在調試做不同的事情和釋放,並再次不同。

設置指針爲空已建議,但我認爲你會過得更好使用智能指針,而不是刪除它們。

+2

使用智能指針 - 真的結束。 – Puppy 2010-06-18 12:44:55

1

可惜我不能對Windows世界說話,但我知道在Unix世界中,做這件事情(在運行時)一些工具

的想法是實現內存分配函數一起一些額外的檢查。當發現問題時,可以通知庫中止進程,並通過查看堆棧跟蹤來發現問題。 solaris上的 libumem就是這方面的一個例子。

我肯定必須是Windows平臺上類似的事情。

有,做靜態代碼分析,這將幫助你找到問題,你運行該代碼之前其他工具。 Coverity就是一個例子,我認爲它也適用於windows。我們設法發現了很多潛在的覆蓋問題。不幸的是,它不是免費的。評估版本應該是可能的。

+0

另一個有用的(非免費)工具是Purify。這是一個運行時內存訪問檢查器,它運行得非常好,可以找出各種潛在的問題。如果你在Linux上,還有valgrind和efence。 – 2010-06-18 08:14:24

2

爲什麼沒有人願意使用智能指針像boost::shared_ptr?如果你使用它,你可以忘記delete -operator。 ;)