为什么我的程序在 boost::enable_shared_from_this<>/boost::shared_ptr<> 中崩溃?

Why is my program crashing in boost::enable_shared_from_this<>/boost::shared_ptr<>?

本文关键字:shared boost lt gt ptr 崩溃 from 程序 我的 enable 为什么      更新时间:2023-10-16

我试图找出程序在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());
}

什么东西?所有的编译都没有任何警告或错误,但事情显然以不那么愉快的方式发生了故障。

我发布了我自己的答案,因为这段代码编译时没有任何警告或错误,并且花了相当多的精力来追踪。

基于上面的例子,当看到这条线时,它应该是非常明显的:

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<>,它具有与boost::shared_ptr<>不同的ABI。值得注意的是,libboost_thread-mt.dylib期望boost::enable_shared_from_this<>类而不是std::enable_shared_from_this<>
  2. 根据enable_shared_from_this<>文件,前提条件不满足。

    要求:enable_shared_from_this必须是T的可访问基类。*它必须是T类型实例T的子对象。必须至少存在一个拥有t.的shared_ptr实例p

    相反,出现了一个std::shared_ptr<>实例,但没有boost::shared_ptr<>实例。

至少这是我对发生的事情的理解。我认为#1是导致segfault的真正问题,#2迟早会成为问题(尽管我并不完全相信(。