gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:02:14 24 4
gpt4 key购买 nike

我正试图找出程序在 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. 调用shared_from_this() in myFunction() 在没有现有 ::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<> documentation , 前提条件不满足。

    Requires: enable_shared_from_this must be an accessible base class of T. *this must be a subobject of an instance t of type T . There must exist at least one shared_ptr instance p that owns t.

    相反发生的是一个 std::shared_ptr<>实例,但不是 boost::shared_ptr<>实例。

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

关于c++ - 为什么我的程序在 boost::enable_shared_from_this<>/boost::shared_ptr<> 中崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15918099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com