在我的應用程序之一,我得到一個斷言在升壓shared_ptr的引用操作中斷言失敗例外:升壓shared_ptr的斷言失敗,但是該值不爲空
T * operator->() const // never throws
{
BOOST_ASSERT(px != 0); <------ fails!
return px;
}
的問題是,使用調試器,我看到px的值不等於0,比如0x7ff ....!這種情況可能嗎? assert如何失敗?
謝謝
在我的應用程序之一,我得到一個斷言在升壓shared_ptr的引用操作中斷言失敗例外:升壓shared_ptr的斷言失敗,但是該值不爲空
T * operator->() const // never throws
{
BOOST_ASSERT(px != 0); <------ fails!
return px;
}
的問題是,使用調試器,我看到px的值不等於0,比如0x7ff ....!這種情況可能嗎? assert如何失敗?
謝謝
正如你自己所說,斷言不是失敗。相反,它內部正在引發異常。這是不一樣的。
我的猜測是boost::shared_ptr::px
成員指向一個不正確的內存位置,它是這樣做的,因爲boost::shared_ptr
對象本身是無效的。
例如,您的boost::shared_ptr
用作某個類的成員嗎?如果是這樣,請檢查對象是否有效(是否this
有效,內存是否損壞)?
更新:
好了 - 你澄清斷言確實失敗後:你曾經分配給mysocket
甚至打電話mysocket.reset()
?
對不起,編輯的問題更加清晰,但斷言實際上失敗了,我在控制檯中得到了這個: /usr/include/boost :: asio :: basic_stream_socket
好的 - 我也更新了我的答案,可能的原因。 –
調試器可以騙你 - 特別是如果建立在發佈模式。 –
你得到了什麼樣的例外?如果它是一個內存訪問異常,那麼它不是由於斷言失敗(其中,順便說一句,沒有在發佈模式下編譯)。 –
Visual Studio經常說0xcdcdcdcd是一個糟糕的指針。 –