我正在研究shared_ptr和enable_shared_from_this的boost文档,我无法弄清楚enable_shared_from_this的实际用途。
以下是我对enable_shared_from_this的理解(从What is the usefulness of `enable_shared_from_this`?复制的示例)。
class Y: public enable_shared_from_this<Y>
{
public:
Y(): count(3){}
shared_ptr<Y> f()
{
return shared_from_this();
}
int count;
}
int main()
{
shared_ptr<Y> p(new Y);
shared_ptr<Y> q = p->f();
cout << "\n Count from P is " << p1->count;
cout << "\n Count from q is " << q1->count;
}
所以,现在我们有一个共享指针q,它指向p(new Y)所拥有的同一个对象,当p和q超出范围时,对象被销毁。上面的两个打印报表都将打印3作为计数。
现在,我可以通过以下方式在不使用enable_shared_from_this的情况下实现相同的目标。
class Y
{
public:
Y(): count(3){}
int count;
}
int main()
{
shared_ptr<Y> p(new Y);
shared_ptr<Y> q(p);
cout << "\n Count from P is " << p1->count;
cout << "\n Count from q is " << q1->count;
}
即使在上面的示例中,P和Q都指向同一个对象并打印3。
那么,使用enable_shared_from_this获得了什么好处?
答案 0 :(得分:8)
shared_from_this
是一种非常特殊的动物。通常,你应该分开职责:一个班做一件事,一件事做。拥有一个资源是一种责任,所以一个类应该拥有一个资源而不做任何其他事情,或者做其他事情但不拥有资源。
shared_from_this
的用法是违反此原则,并且类知道它由共享指针拥有。在这种情况下,您需要一种方法来获取拥有您的环境共享指针。您不能简单地说shared_ptr<T>(this)
,因为这会创建新所有者,而不是与现有所有者共享所有权。
要从班级与其周围所有者进行通信,您需要从enable_shared_from_this
派生,然后使用shared_from_this
生成新的股东。
(这实际上通过向类添加weak_ptr<T>
成员来实现,并且在创建环境共享指针时,该弱指针被设置为观察共享指针。因此shared_from_this
是一个简单的lock()
{1}}对弱指针的调用。)
以下是澄清用法的示例:
auto x = std::make_shared<T>();
f(*x);
// ...
void f(T const & t)
{
auto y = t.shared_from_this();
// ...
}
在f
内,我们没有立即看到t
的所有者,但是shared_from_this
将其带出来。
答案 1 :(得分:0)
利益是结构化的问题。在您的示例中,拥有q
的人可能对拥有p
的人一无所知或有权访问。有时更容易从类型中获取另一个shared_ptr
到同一个实例(在本例中为Y
)。
那就是说,我个人从不使用enable_shared_from_this
。就我而言,它与单身人士在同一条船上。