具有不完整类型的非共享智能指针

时间:2012-01-30 09:26:18

标签: c++ boost c++11 shared-ptr unique-ptr

是否存在标准指针类(或Boost),它是一个非完整类型的非共享指针?我已经查看了C ++ 11标准和boost库,但找不到它,虽然它看起来像是一个非常有用的类型。

例如,我希望能够使用智能指针创建不透明类型。

  class A;
  wrap_ptr<A> some_func();
  void other_func( A const & );

A是一种不透明类型,可用于各种功能。上述接口的用户只有一个不完整的A定义,但应该能够删除/重置指针。我知道上面的内容可以用shared_ptr来完成,但是这个代码中我不想要开销。 unique_ptr具有正确的所有权语义,但不能使用不完整的类型。从理论上讲,包装器只需要有一个指向删除器的指针。

C ++ 11或boost库中是否有这样的类型?

注意:我知道我可以轻松构建此类型,但如果可能,我更喜欢标准类型。它似乎应该是一个基本的智能指针类型。


更新unique_ptr似乎不是一个好选择。首先,语法开销会抵消。其次,我不相信它可以安全地与自定义删除器一起使用。我会检查它是如何工作的。

3 个答案:

答案 0 :(得分:9)

要明确unique_ptr:它确实适用于不完整的类型,但是如果你在类的标题中使用它:

#include <memory>

class A;

class B
{

std::unique_ptr<A> m_a;

};

由于缺少删除器实现,它不会链接。 有一个简单的解决方法:只需在cpp中定义主机类的de析构函数,即使它是空的或应该是默认的!

// B.hpp
#include <memory>

class A;

class B
{
public:

    B();
    ~B();

private:

std::unique_ptr<A> m_a;

};

// B.cpp

B::B(){} // or =default; (if you have a compiler providing it)
B::~B(){} // or =default; (if you have a compiler providing it)

另外,请在那里阅读我的问题的答案:Is std::unique_ptr<T> required to know the full definition of T?

也许可以看一下Herb Sutter建议如何使用pimpl成语(暗示unique_ptr中的不完整类型):http://herbsutter.com/gotw/_100/

答案 1 :(得分:4)

实际上,unique_ptr可以使用不完整的类型,只要您指定自定义删除器。

然而,与shared_ptr相反,这实际上影响了它的类型,因为自定义删除器是静态精确的(作为第二个模板参数)。

答案 2 :(得分:1)

std::unique_ptr可以处理这种情况,但不能使用默认删除器。您需要编写一个可以处理不完整类型的删除器,然后使用std::unique_ptr<A,MyDeleter>