3

でプログラムがクラッシュする理由を突き止めようとしてい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> (e=@0x1002c5b88) at throw_exception.hpp:66
#10 0x0000000100057bf4 in boost::detail::shared_count::shared_count (this=0x1002c5d00, r=@0x100304180) at shared_count.hpp:509
#11 0x0000000100057b7d in boost::detail::shared_count::shared_count (this=0x1002c5d00, r=@0x100304180) at shared_count.hpp:511
#12 0x000000010004ad14 in boost::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass>::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass> (this=0x1002c5cf8, r=@0x100304178) at shared_ptr.hpp:220
#13 0x000000010004acad in boost::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass>::shared_ptr<myns::(anonymous namespace)::MySharedFromThisClass> (this=0x1002c5cf8, r=@0x100304178) 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

1 に答える 1

4

このコードのチャンクは警告やエラーなしでコンパイルされ、追跡するのにかなりの労力を要したため、私自身の回答を投稿しています。

次の行を見ると、上記の例に基づいてかなり明白なはずです。

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

myKlass のタイプは でありstd::shared_ptr<MySharedFromThis>、 ではありませんboost::shared_ptr<MySharedFromThis>。に変更std::make_shared<>するboost::make_shared<>と、すべてが期待/意図どおりに機能します。

このクラッシュには、次の 2 つの原因が考えられます。

  1. shared_from_this()myFunction()への呼び出しは、既存のものなしで呼び出され::boost::shared_ptr<>ていました。代わりに、std::shared_ptr<>.a とは異なる ABI を持つ が作成されましたboost::shared_ptr<>。特に、 aはクラスではなくクラスをlibboost_thread-mt.dylib期待しています。boost::enable_shared_from_this<>std::enable_shared_from_this<>
  2. enable_shared_from_this<> ドキュメントによると、前提条件が満たされていませんでした。

    必須: enable_shared_from_this は、T のアクセス可能な基本クラスでなければなりません。 *this は、型 T のインスタンス t のサブオブジェクトでなければなりません。t を所有する shared_ptr インスタンス p が少なくとも 1 つ存在する必要があります。

    代わりに、インスタンスはありましたが、std::shared_ptr<>インスタンスではありませんでしたboost::shared_ptr<>

少なくとも、それは何が起こっていたのかについての私の理解です。#1 は segfault につながる本当の問題であり、#2 は遅かれ早かれ問題になると思います (完全には確信していませんが)。

于 2013-04-10T05:59:22.520 に答える