我正在尝试寻找一个程序在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());
}
是什么给出的?所有东西都没有任何警告或错误,但是事情非常明显地以不那么令人愉快的方式进行。但
答案 0 :(得分:4)
我发布了自己的答案,因为这段代码编译时没有任何警告或错误,并且花了相当多的精力来追踪。
在查看此行时,基于上面的示例应该非常明显:
auto myKlass = std::make_shared<MySharedFromThis>();
myKlass的类型为std::shared_ptr<MySharedFromThis>
,而不是boost::shared_ptr<MySharedFromThis>
。将std::make_shared<>
更改为boost::make_shared<>
,一切都按预期/预期进行。
导致此次崩溃的可能性有两种:
shared_from_this()
的调用,而现有的::boost::shared_ptr<>
已经存在。相反,发生的是std::shared_ptr<>
被创建,其具有与boost::shared_ptr<>
不同的ABI。值得注意的是,libboost_thread-mt.dylib
期望boost::enable_shared_from_this<>
课程,而不是std::enable_shared_from_this<>
课程。根据enable_shared_from_this<> documentation,前提条件不满意。
需要:enable_shared_from_t这必须是T的可访问基类。*这必须是T类型的实例t的子对象。必须存在至少一个拥有t的shared_ptr实例p。
相反,发生的事情是std::shared_ptr<>
个实例,而不是boost::shared_ptr<>
个实例。
至少那是我对正在发生的事情的理解。我认为#1是导致段错误的真正问题,#2迟早会成为一个问题(尽管我并不完全相信)。