2009-02-05 128 views
10

我有一個Linux C++應用程序,我想在取消引用前測試對象指針的有效性。但是,由於分段錯誤,try/catch在Linux上不適用。如何才能做到這一點?嘗試/捕捉Linux上的段錯誤

回答

8

如果您有一個應用中的許多指針引用相同的有限生命週期對象的情況,一種流行的解決方案是使用boost smart pointers編輯:在C++ 11,這兩種類型的標準庫中提供

您可能需要使用shared_ptr爲指針(S)是負責你的對象和weak_ptr爲其他指針的壽命,這可能會失效。您會看到weak_ptr具有您要求內置的有效性檢查。

4

將指針初始化爲NULL。如果經過一些處理,它仍然是NULL,它是無效的,否則它是有效的。

+0

如果刪除的對象是指針不是NULL,而是指向無效的內存。我如何驗證這樣的指針? – jackhab 2009-02-05 09:49:09

+1

爲什麼你會這麼想?你刪除了它。如果你在任何地方使用指針,並且你不確定它們是否被刪除,那麼你正在做一些非常錯誤的事情。 – Bombe 2009-02-05 09:50:30

+0

我其次。無效指針是無效指針。之後,指針變量不再可用,或者將其設置爲0.或者,因爲這是C++,請了解RAII。 – gimpf 2009-02-05 10:45:13

4

對於這一次發生,您可以爲SIGSEGV啓用信號處理程序。詳細信息請參見手冊頁「信號」。另一種選擇是使用保證有效的引用。這取決於你的應用程序。

+0

手冊頁說,如果忽略SIGSEGV,則進程狀態是未定義的。捕獲SIGSEGV後可以恢復C++應用程序嗎? – jackhab 2009-02-05 09:55:22

8

分段錯誤不是異常(如Java的NullPointerException);它是從OS發送到進程的信號。查看the manpage for sigaction以獲取有關如何安裝分段故障處理程序(SIGSEGV)的指示信息。

1

你如何測試指針的有效性?比較NULL?

你所做的最好的事情是在Valgrind下運行你的程序。一個錯誤可能在一個完全不同的地方。

更新:在Win32平臺上有一些像__try __except,它允許捕捉一些異常。據我所知,該Win32功能沒有與Linux相當的功能。

0

如果您將處理程序附加到SIGSEGV,除了記錄錯誤發生和優雅失敗的事實之外,您可以做的事情並不多。發生此違規時,您的程序處於未定義狀態,因此可能不安全以繼續正常操作。

除了檢查NULL之外,我不認爲有一種方法可以檢查指針是否在您描述的意義上是「有效」的。在正常操作過程中,像這樣的錯誤不應該發生,因爲它們代表一個錯誤,所以你應該希望程序失敗,儘管優雅。

0

指針存儲在對象中。它們在構造函數中初始化,可能爲0(NULL)。它們在析構函數中被刪除,可能在賦值中,很少在其他函數中被刪除。當在析構函數以外的成員中被刪除時,它們立即被分配一個新的值或0.

2

沒有自然的,通用的原始C++指針。 C++假定你會跟蹤這些信息。

在大多數情況下,您可以通過記住在無效時將指針設置爲NULL來處理此問題。最初不指向的新指針應該設置爲NULL,並且新刪除的對象應將其指針設置爲NULL。