将std :: shared_ptr与受保护的构造函数\析构函数一起使用

dan*_*nny 5 c++ shared-ptr c++11

可能重复:
如何在只有受保护或私有构造函数的类上调用:: std :: make_shared?

我想创建一个类的共享指针,并有一个工厂方法返回它,同时保持构造函数\析构函数的保护.由于共享指针无法访问构造函数或析构函数,因此出现编译错误.

我正在使用llvm 4.1,但我正在寻找一个可以独立于编译器的解决方案(除了使构造函数\析构函数公开).

这是一个代码示例:

class Foo
{
public:
    static std::shared_ptr<Foo> getSharedPointer()
    {
        return std::make_shared<Foo>();
    }

protected:
    Foo(int x){}
    ~Foo(){}

};
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

syp*_*lex 2

只需自己分配指针,而不是调用 make_shared:

static std::shared_ptr<Foo> getSharedPointer()
{
    return std::shared_ptr<Foo>(new Foo);
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这需要将析构函数公开。

  • 这可以解决构造函数错误,但不能解决析构函数。它还存在性能问题,因为它将执行额外的内存分配 (2认同)
  • 使用 make_shared 有充分的理由,包括更少的堆分配和更好的引用局部性。 (2认同)