10

是否有一个标准指针类(或 Boost),它是一个适用于不完整类型的非共享指针?我已经查看了 C++11 标准和 boost 库,但找不到一个,尽管它似乎是一种非常有用的类型。

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

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

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

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

注意:我知道我可以轻松构建这种类型,但如果可能的话,我更喜欢标准类型。看起来它应该是一种基本的智能指针类型。


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

4

3 回答 3

9

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

#include <memory>

class A;

class B
{

std::unique_ptr<A> m_a;

};

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

// 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)

另外,请阅读我的问题的答案:是否需要 std::unique_ptr<T> 才能知道 T 的完整定义?

也许看看 Herb Sutter 建议如何实现 pimpl idiom(暗示 unique_ptr 中的不完整类型):http: //herbsutter.com/gotw/_100/

于 2012-01-30T13:14:47.097 回答
5

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

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

于 2012-01-30T09:33:27.470 回答
2

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

于 2012-01-30T09:34:56.530 回答