2012-11-12 56 views
1

在我的應用程序之一,我得到一個斷言在升壓shared_ptr的引用操作中斷言失敗例外:升壓shared_ptr的斷言失敗,但是該值不爲空

T * operator->() const // never throws 
{ 
    BOOST_ASSERT(px != 0); <------ fails! 
    return px; 
} 

的問題是,使用調試器,我看到px的值不等於0,比如0x7ff ....!這種情況可能嗎? assert如何失敗?

謝謝

+3

調試器可以騙你 - 特別是如果建立在發佈模式。 –

+0

你得到了什麼樣的例外?如果它是一個內存訪問異常,那麼它不是由於斷言失敗(其中,順便說一句,沒有在發佈模式下編譯)。 –

+0

Visual Studio經常說0xcdcdcdcd是一個糟糕的指針。 –

回答

1

正如你自己所說,斷言不是失敗。相反,它內部正在引發異常。這是不一樣的。

我的猜測是boost::shared_ptr::px成員指向一個不正確的內存位置,它是這樣做的,因爲boost::shared_ptr對象本身是無效的。

例如,您的boost::shared_ptr用作某個類的成員嗎?如果是這樣,請檢查對象是否有效(是否this有效,內存是否損壞)?

更新:

好了 - 你澄清斷言確實失敗後:你曾經分配給mysocket甚至打電話mysocket.reset()

+0

對不起,編輯的問題更加清晰,但斷言實際上失敗了,我在控制檯中得到了這個: /usr/include/boost :: asio :: basic_stream_socket :: operator - > :asio :: stream_socket_service >]:聲明'px!= 0'失敗。 – cpl

+0

好的 - 我也更新了我的答案,可能的原因。 –