2013-04-10 77 views
3

我試圖追捕爲什麼一個程序崩潰在shared_ptr爲什麼我的程序在boost :: enable_shared_from_this <>/boost :: shared_ptr <>中崩潰?

#0 0x00007fff90723212 in __pthread_kill() 
#1 0x00007fff93415b54 in pthread_kill() 
#2 0x00007fff93459dce in abort() 
#3 0x00007fff8a0519eb in abort_message() 
#4 0x00007fff8a04f39a in default_terminate() 
#5 0x00007fff930bf887 in _objc_terminate() 
#6 0x00007fff8a04f3c9 in safe_handler_caller() 
#7 0x00007fff8a04f424 in std::terminate() 
#8 0x00007fff8a05058b in __cxa_throw() 
#9 0x0000000100057cbc in boost::throw_exception<boost::bad_weak_ptr> ([email protected]) at throw_exception.hpp:66 
#10 0x0000000100057bf4 in boost::detail::shared_count::shared_count (this=0x1002c5d00, [email protected]) at shared_count.hpp:509 
#11 0x0000000100057b7d in boost::detail::shared_count::shared_count (this=0x1002c5d00, [email protected]) at shared_count.hpp:511 
#12 0x000000010004ad14 in boost::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass>::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass> (this=0x1002c5cf8, [email protected]) at shared_ptr.hpp:220 
#13 0x000000010004acad in boost::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass>::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass> (this=0x1002c5cf8, [email protected]) at shared_ptr.hpp:223 
#14 0x000000010004a9b4 in boost::enable_shared_from_this<myns::(anonymous namespace)::MySharedFromThisClass>::shared_from_this (this=0x100304178) at enable_shared_from_this.hpp:49 

MySharedFromThisClass定義爲:

class MySharedFromThis : public boost::enable_shared_from_this<MySharedFromThis> { 
    // .... 
}; 

而這是正在傳遞的實例的定義,如:

auto myKlass = std::make_shared<MySharedFromThis>(); 

而經由圍繞複製:

void myFunction(::boost::shared_ptr<MySharedFromThis> myKlass) { 
    myFunction(shared_from_this()); 
} 

什麼原因呢?沒有任何警告或錯誤的東西編譯,但事情非常清楚地以不愉快的方式進行段錯誤。

回答

4

我發佈了我自己的答案,因爲這段代碼編譯時沒有任何警告或錯誤,並花費相當多的精力追查。

應該基於在這條線的時候看上面的例子是相當明顯的:

auto myKlass = std::make_shared<MySharedFromThis>(); 

myKlass的類型std::shared_ptr<MySharedFromThis>,不boost::shared_ptr<MySharedFromThis>的。將std::make_shared<>更改爲boost::make_shared<>,並且一切按預期/預期工作。

有兩種可能的事情導致這種崩潰:

  1. 在myFunction的到shared_from_this()()的調用是被稱爲沒有現成::boost::shared_ptr<>已經存在。相反,發生了什麼是std::shared_ptr<>被創建,其具有不同的ABI,即boost::shared_ptr<>。值得注意的是libboost_thread-mt.dylib預計boost::enable_shared_from_this<>類,而不是std::enable_shared_from_this<>類。
  2. 根據enable_shared_from_this<> documentation,前提條件未得到滿足。

    要求:enable_shared_from_this必須是一個可訪問的基類T. *這必須是類型T的實例t的子對象。必須至少存在一個擁有t的shared_ptr實例p。

    而是發生了什麼事情是有一個std::shared_ptr<>實例,但不是boost::shared_ptr<>實例。

至少這是我發生了什麼事情的理解。我覺得#1是導致段錯誤的現實問題,並#2將是一個問題遲早(雖然我並不完全相信)。

+1

ABI在這裏不是問題。正如預期的那樣,您只會得到'bad_weak_ptr'異常,但不要捕獲它,所以線程(和進程)終止。 – 2013-04-10 07:56:42

+1

使用'enable_shared_from_this <>'被調用'shared_form_this()'這個異常的對象的構造函數的一個常見原因被共享 - 不是一種罕見的事情,如果你想傳遞一個指向對象到其聚集的構造成員。整潔的解決辦法是宣佈你的構造私人和提供工廠方法,在其中您可以用'shared_form_this()'同性戀放棄。 – marko 2013-04-10 14:18:15

相關問題