是否有像auto_ptr和shared_ptr这样的通用智能指针不需要C ++ 0x?

时间:2010-09-22 09:17:48

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

我想要一个非引用计数智能指针,它可以结合auto_ptrshared_ptr的一些有用方面。我认为C ++ 0x的unique_ptr最终是我需要的,但我需要能在Visual Studio 2008和Xcode(gcc 4.2)上编译的东西。

我需要的功能是:

  • 可用于工厂方法,以便在复制时转移所有权(如auto_ptr)
  • 支持release()(如auto_ptr)
  • 可与前向声明(如shared_ptr)
  • 一起使用

所以,我认为它真的更好auto_ptr。是否有任何东西在提升或其他地方做到这一点(注意:我没有时间把我的头包裹在Loki周围)?或者我应该自己滚动?

编辑:我刚刚阅读了更多关于auto_ptr的内容 - 如果您确保每个.cpp中都包含类标头,那么听起来可以将它与前向声明一起使用使用智能指针引用标头的文件(例如,请参阅GotW)。有人对此有任何一般性建议或经验法则吗?

EDIT2:shared_ptr不可接受的原因是因为我需要一个release()方法,因为我通过引入工厂方法来整理一些遗留代码,但它必须与一些手动指针所有权代码共存。在整个代码库中使用shared_ptr会很棒,但这是一项艰巨的任务。

EDIT3:最后,一旦我发现前向包含的怪癖,auto_ptr就足够了。尝试为shared_ptr编写自定义删除器以允许可选地删除指针也会很有趣。

3 个答案:

答案 0 :(得分:5)

编辑:在我的原始答案中,我无法理解您boost::shared_ptr是不可接受的(可能是出于演出原因)。

正如您所说,

auto_ptr支持前向声明。您需要在可能破坏auto_ptr引用的对象的位置包含引用类的标头。但请注意,auto_ptr的语义略显古怪,需要一些小心。

以下问题的答案包含更多信息,包括unique_ptr只能为C ++ 0x实现的原因,因为它需要rvalue引用:

unique_ptr boost equivalent?

答案 1 :(得分:2)

C ++ TR1 (由现代GCC和Visual Studio支持)内置shared_ptr and others (cf. Wikipedia)。这些主要来自 Boost ,几乎适用于任何现代编译器。

如果您需要严格的所有权,可以查看scoped_ptr

答案 2 :(得分:2)

使用一些样板代码,您可以在C ++ 03中approximate unique_ptr。这不是一个完美的模拟。例如,您需要更明确的move次来电,才能返回本地unique_ptr