我想要一个非引用计数智能指针,它可以结合auto_ptr
和shared_ptr
的一些有用方面。我认为C ++ 0x的unique_ptr
最终是我需要的,但我需要能在Visual Studio 2008和Xcode(gcc 4.2)上编译的东西。
我需要的功能是:
release()
(如auto_ptr)所以,我认为它真的更好auto_ptr
。是否有任何东西在提升或其他地方做到这一点(注意:我没有时间把我的头包裹在Loki周围)?或者我应该自己滚动?
auto_ptr
的内容 - 如果您确保每个.cpp中都包含类标头,那么听起来可以将它与前向声明一起使用使用智能指针引用标头的文件(例如,请参阅GotW)。有人对此有任何一般性建议或经验法则吗?
EDIT2:shared_ptr不可接受的原因是因为我需要一个release()方法,因为我通过引入工厂方法来整理一些遗留代码,但它必须与一些手动指针所有权代码共存。在整个代码库中使用shared_ptr会很棒,但这是一项艰巨的任务。
EDIT3:最后,一旦我发现前向包含的怪癖,auto_ptr
就足够了。尝试为shared_ptr
编写自定义删除器以允许可选地删除指针也会很有趣。
答案 0 :(得分:5)
编辑:在我的原始答案中,我无法理解您boost::shared_ptr
是不可接受的(可能是出于演出原因)。
auto_ptr
支持前向声明。您需要在可能破坏auto_ptr
引用的对象的位置包含引用类的标头。但请注意,auto_ptr
的语义略显古怪,需要一些小心。
以下问题的答案包含更多信息,包括unique_ptr
只能为C ++ 0x实现的原因,因为它需要rvalue引用:
答案 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
。