有关enable_shared_from_this的问题

时间:2011-06-26 07:56:11

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

  

可能重复:
  what is the usefulness of enable_shared_from_this

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

成员函数中的共享指针

有时在其成员函数中需要指向当前对象的共享指针。 Boost提供了一个名为enable_shared_from_this的mixin模板类,它定义了一个名为shared_from_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()方法在这里扮演什么角色? (我试着在我们说话的时候解决这个问题......但为了以防万一!:))

谢谢, 帕,

1 个答案:

答案 0 :(得分:2)

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

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

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

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