gpt4 book ai didi

c++ - enable_shared_from_this 什么时候有用?

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:49 26 4
gpt4 key购买 nike

我一直在尝试理解从 enable_shared_from_this 继承的有用性,尽管那里对这种机制的工作原理做了一些解释。我在 post 上找不到这个问题的答案所以我把它贴在这里。

在其中一个例子中。以下示例作为不良做法给出。我理解原因是两个共享指针彼此不认识,一旦其中一个共享指针超出范围,资源将被销毁。

struct S
{
shared_ptr<S> dangerous()
{
return shared_ptr<S>(this); // don't do this!
}
};

int main()
{
shared_ptr<S> sp1(new S);
shared_ptr<S> sp2 = sp1->dangerous();
return 0;
}

我的问题是为什么用户不这样做

 shared_ptr<S> sp2 = sp1;

那不也只会增加引用计数吗?会好吗?是否给出了该示例以防万一该类无法访问 sp1 并且需要返回一个 shared_ptr

最佳答案

核心问题在于,出于某种原因,并非代码库中的每个共享指针都为其余代码“已知”。

如果您有权访问已给定的 shared_ptr你应该总是使用 shared_ptr<S> sp2 = sp1;正如你所写的。使用 std::enable_shared_from_this 绝对好而且更好.

让我们举个例子:

struct S: std::enable_shared_from_this<S>
{
std::shared_ptr<S> getPtr() { return shared_from_this(); }
};

// Here we have no interface for providing a shared_ptr, maybe
// code that we can't change or maintain or comes as callback from
// a library we want to use
void f( S* s )
{
// here we have no access to shared_ptr<S>...
// so we need to have access to the unique counting instance
// of all other shared_ptr which are pointing to this object
std::shared_ptr<S> p3 = s->getPtr();
std::cout << p3.use_count() << std::endl;

// do some stuff....

}

int main()
{
std::shared_ptr<S> p1 = std::make_shared<S>();
std::cout << p1.use_count() << std::endl;

// This example is useless, as you can directly use p1
std::shared_ptr<S> p2 = p1->getPtr();
std::cout << p1.use_count() << std::endl;
std::cout << p2.use_count() << std::endl;

// But if we have to use a interface, which is not providing access via shared_ptr like this:
f(p1.get());
}

这里解决的关键问题是简单地访问连接我们系统 IF 中所有其他 shared_ptr 的公共(public)“句柄”!我们根本无权访问任何 shared_ptr!

我们无法访问我们对象的任何现有 shared_ptr 的原因可能有很多,例如:使用只允许原始指针的旧接口(interface),但我们想在我们的其余代码中使用共享 ptr,使用回调来自也只支持原始指针等的库。

使用 std::enable_shared_from_this<S>有一些缺点:

你的接口(interface)不能使用const S*不再,就像创建一个新的 shared_ptr将修改std::enable_shared_from_this的数据现在是您的类或结构的基类。它还会增加对象的大小。

关于c++ - enable_shared_from_this<S> 什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585977/

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