2010-08-22 90 views
29

我有一個相當複雜的多線程應用程序(服務器)不時會崩潰由於斷言:shared_ptr的斷言PX = 0失敗

/usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = msg::Player]: Assertion `px != 0' failed. 

我一直無法查明原因,是想知道這是一個問題與boost :: shared_ptr或它是我?

我試過g ++ 4.4.3-4ubuntu5和llvm-g ++(GCC)4.2.1,並且沒有優化和優化,libboost1.40-dev(= 1.40.0-4ubuntu4)。

+1

多線程錯誤很難查明。既然你在linux上,沒有理由不使用valgrind--它會幫助你很大程度地發現錯誤。 – nos 2010-08-22 12:00:31

+0

我正在廣泛使用valgrind,並且在斷言發生之前我得到了零錯誤(使用memcheck)。我仍然在學習如何解釋drd錯誤消息,因爲它們中的大多數(布爾型/整型類型的衝突加載/存儲)似乎不是問題。 – Horacio 2010-08-22 22:07:16

回答

33

只要您正確初始化共享指針併爲所有共享對象庫使用相同的內存管理上下文,使用boost::shared_ptr應該沒有問題。

在你的情況下,你正在嘗試使用未初始化的共享指針。

boost::shared_ptr<Obj> obj; 
obj->Something(); // assertion failed 

boost::shared_ptr<Obj> obj(new Obj); 
obj->Something(); // ok 

我會建議儘可能在聲明時對它們進行初始化。異常處理可以爲代碼運行創建許多「隱藏」路徑,識別未初始化的共享指針可能相當困難。

PS:還有其他問題,如果您加載/卸載模塊shared_ptr正在使用導致混亂。這是很難解決的,但在這種情況下,你將有一個非零指針。這不是你現在正在發生的事情。