Dev*_*Dev 1 c++ boost shared-ptr
我正在研究shared_ptr和enable_shared_from_this的boost文档,我无法弄清楚enable_shared_from_this的实际用途.
以下是我对enable_shared_from_this的理解(示例复制自`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;
}
Run Code Online (Sandbox Code Playgroud)
所以,现在我们有一个共享指针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;
}
Run Code Online (Sandbox Code Playgroud)
即使在上面的例子中,P和Q都指向同一个对象并将打印3.
那么,使用enable_shared_from_this,我获得了什么好处?
shared_from_this是一种非常特殊的动物.通常,你应该分开责任:一个班做一件事,一件事做.拥有一个资源是一种责任,所以一个类应该拥有一个资源而不做任何其他事情,或者做一些事情但不拥有资源.
用法shared_from_this是在违反此原则时,类知道它由共享指针拥有.在这种情况下,您需要一种方法来获取拥有您的环境共享指针.您不能简单地说shared_ptr<T>(this),因为这将创建一个新的所有者,而不是与现有所有者共享所有权.
要从类通信到其环境所有者,您需要派生自enable_shared_from_this,然后用于shared_from_this生成新的股东.
(这实际上通过向weak_ptr<T>类添加成员来实现,并且在创建环境共享指针时,该弱指针被设置为观察共享指针.因此对弱指针shared_from_this进行简单的lock()调用.)
这是一个澄清用法的例子:
auto x = std::make_shared<T>();
f(*x);
// ...
void f(T const & t)
{
auto y = t.shared_from_this();
// ...
}
Run Code Online (Sandbox Code Playgroud)
在里面f,我们不会t立即看到所有者,而是shared_from_this将其带出来.
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |