gpt4 book ai didi

c++ - 尝试理解 std::enable_shared_from_this 但使用它会导致 bad_weak_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:48 25 4
gpt4 key购买 nike

我试图理解 std::enable_shared_from_this 类的行为,但我无法理解。所以我写了一个简单的程序来测试不同的情况。

问题

谁能解释一下下面代码的行为,因为我无法解释观察到的结果。

谢谢你的帮助。

代码

#include <iostream>
#include <memory>

struct C : std::enable_shared_from_this<C> { };

int main () {
{//test 1
std::shared_ptr<C> foo, bar;
foo = std::make_shared<C>();
bar = foo->shared_from_this(); //ok
std::cout<<"shared_ptr : ok"<<std::endl;
}

{//test 2
std::shared_ptr<C> foo = std::shared_ptr<C>(new C);
std::shared_ptr<C> bar;
bar = foo->shared_from_this(); //ok
std::cout<<"shared_ptr + New : ok"<<std::endl;
}

{//test 3
C* foo = new C;
std::shared_ptr<C> bar;
bar = foo->shared_from_this(); //throw std::bad_weak_ptr
std::cout<<"New : ok"<<std::endl;
}

{//test 4 (should make a invalid free of something like that)
C foo;
std::shared_ptr<C> bar;
bar = foo.shared_from_this();//throw std::bad_weak_ptr
std::cout<<"local : ok"<<std::endl;
}

return 0;
}

这是输出:

shared_ptr : ok
shared_ptr + New : ok
terminate called after throwing an instance of 'std::bad_weak_ptr'
what(): bad_weak_ptr

构建信息

  • 系统:Windows 7 x64
  • 编译器:mingw 4.9.2 x64

最佳答案

enable_shared_from_this 的约定是当您调用 shared_from_this() 时它将提供一个 shared_ptr 如果对象由 shared_ptr 管理。如果尚未被管理,则它无法自行创建 shared_ptr

在上一个测试用例中,您已经知道为什么允许 shared_from_this() 为您创建一个共享指针是个坏主意...

关于c++ - 尝试理解 std::enable_shared_from_this<T> 但使用它会导致 bad_weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389401/

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