我想知道共享指针是什么。所以,我用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()方法在这里扮演什么角色? (我试着在我们说话的时候解决这个问题......但为了以防万一!:))
谢谢, 帕,
答案 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。