【问题标题】:Question on enable_shared_from_this [duplicate]关于 enable_shared_from_this 的问题 [重复]
【发布时间】:2011-09-22 21:26:04
【问题描述】:

可能重复:
what is the usefulness of enable_shared_from_this

我想知道共享指针是什么。所以,我用谷歌搜索了一下,对它们有了一些了解。我遇到了一个网站,它提供了 smaprt 指针概念的简要概述。但是,我无法理解他们想要通过以下方式传达的内容(或者更确切地说是如何实现)。

成员函数中的共享指针

有时在其成员函数中需要一个指向当前对象的共享指针。 Boost 提供了一个名为 enable_shared_from_this 的 mixin 模板类,它定义了一个名为 shared_from_this() 的无参数成员函数。它返回一个指向 this 的共享指针。在第一次使用此方法之前,必须至少存在一个指向此对象的共享指针的实例;否则它有未定义的结果(通常是崩溃)。保证满足条件的最好方法是使构造函数受保护并提供一个工厂方法,该方法返回一个指向新创建对象的共享指针。

class Foo : public enable_shared_from_this<Foo> {
public:
   void someMethod() {
      boost::shared_ptr<Foo> this_ = shared_from_this();
      // use pointer...
   }
   ...
   static boost::shared_ptr<Foo> create() {
      return boost::shared_ptr<Foo>(new Foo());
   }
protected:
   Foo() { ... }
   ...
};

谁能告诉我如何创建这个类的对象以及 create() 方法在这里扮演什么角色? (我想在我们说话的时候弄清楚这一点……但以防万一!:))

谢谢, 帕万,

【问题讨论】:

标签: c++ shared-ptr smart-pointers


【解决方案1】:

此类(“mixin”)适用于您知道需要共享访问的类。这允许类包含此信息(使用shared_ptr 共享),而不是从类外部管理shared_ptrs,从而避免一些常见的陷阱。

当您使用 share_ptr 做某事时,一个常见的陷阱是使用相同的原始指针初始化多个 share_ptr -

Bla *bla = new Bla;
shared_ptr<Bla> x(bla);
shared_ptr<Bla> y(bla);

这段代码有一个bug,两个share_ptrs 不知道对方,都将delete 指针。但是,如果您使用此 mixin,则该类本身负责管理其 share_ptrs,这使得该错误不可能发生,因为实例的所有 share_ptrs 都来自同一来源。
这也是为什么您希望构造函数是私有的或受保护的。您不希望用户能够创建该类的实例,因为这将允许他再次编写上述代码。
create 函数是你的入口点,类编写者实例化类。调用new 并将参数传递给构造函数。 boost 不想为您调用 new,因为您可能想要使用分配器或使用非平凡的 c'tor。

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2012-08-11
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多