gpt4 book ai didi

c++ - enable_shared_from_this 与直接赋值

转载 作者:太空狗 更新时间:2023-10-29 20:10:37 30 4
gpt4 key购买 nike

为什么我应该使用 enable_shared_from_this 因为我也可以通过简单的赋值获得相同的效果。

struct A : std::enable_shared_from_this<A> {
std::shared_ptr<A> getptr() {
return shared_from_this();
}
};


int main () {
// What is the differentce between this code
std::shared_ptr<A> p1 = make_shared<A>();
std::shared_ptr<A> p2 = p1->getptr();

// Vs this

std::shared_ptr<A> p1 = make_shared<A>();
std::shared_ptr<A> p2 = p1;
}

最佳答案

因为你无法获得“相同”的效果,至少不是你可能想到的那种。

发布的代码方法没有区别,正是因为A继承自 std::enable_shared_from_this<A> . p1 和 p2 都是引用相同具体对象的 shared_ptr 对象(假设只有其中一个部分是为您的测试编译的,否则您会在 id 名称重用时出错)。

std::enable_shared_from_this<T>允许您获得 std::shared_ptr<T>来自某个对象,由一些预先存在的正式管理 std::shared_ptr<T>类型 T或其衍生物,在你没有 std::shared_ptr<T> 的地方以其他方式获得的对象,但出于某种原因需要一个。例如:

#include <iostream>
#include <memory>

struct A;

void foo(std::shared_ptr<A> arg)
{
}

struct A : std::enable_shared_from_this<A>
{
void method()
{
foo(shared_from_this());
}
};


int main ()
{
auto a = std::make_shared<A>();
a->method();
}

在上面的例子中,foo需要 std::shared_ptr<A>作为参数。来自 A::method() 的正文没有 std::enable_shared_from_this<A> 就不存在这样的机制作为基地。没有 std::enabled_shared_from_this<T>基地,你必须提供一种替代机制来传递 a沿着调用链向下共享指针,直到它到达 foo .简而言之,它看起来像这样:

#include <iostream>
#include <memory>

struct A;

void foo(std::shared_ptr<A> arg)
{
}

struct A
{
void method(std::shared_ptr<A> me)
{
foo(me);
}
};


int main ()
{
std::shared_ptr<A> a = std::make_shared<A>();
a->method(a);
}

这显然是可怕而可怕的。此外,无法保证memethod实际上是一个 std::shared_ptr<T>this .因此,标准委员会祝福我们 std::enable_shared_from_this<T> .

关于c++ - enable_shared_from_this 与直接赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38238876/

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