C++ 是否有像auto#ptr和shared#ptr这样的通用智能指针不';不需要C++;0x?

C++ 是否有像auto#ptr和shared#ptr这样的通用智能指针不';不需要C++;0x?,c++,shared-ptr,smart-pointers,C++,Shared Ptr,Smart Pointers,我想要一个非引用计数的智能指针,它可以结合自动\u ptr和共享\u ptr的一些有用方面。我认为C++0x的unique_ptr最终是我所需要的,但我需要一些可以在VisualStudio2008和Xcode(GCC4.2)上编译的东西 我需要的功能是: 可在工厂中使用的方法,以便在复制时转移所有权(如auto_ptr) 支持release()(如auto\u ptr) 可与转发声明一起使用(如共享\u ptr) 所以,我想这真的是一个更好的auto\u ptr。在boost或其他地方有没

我想要一个非引用计数的智能指针,它可以结合
自动\u ptr
共享\u ptr
的一些有用方面。我认为C++0x的
unique_ptr
最终是我所需要的,但我需要一些可以在VisualStudio2008和Xcode(GCC4.2)上编译的东西

我需要的功能是:

  • 可在工厂中使用的方法,以便在复制时转移所有权(如auto_ptr)
  • 支持
    release()
    (如auto\u ptr)
  • 可与转发声明一起使用(如共享\u ptr)
所以,我想这真的是一个更好的
auto\u ptr
。在boost或其他地方有没有这样做的东西(注意:我没有时间去想Loki)?还是我应该自己滚

编辑:我刚刚阅读了更多关于
auto_ptr
——如果您确保类头包含在每个用智能指针引用头的.cpp文件中(例如,请参阅),则可以将其用于转发声明。有人对此有什么一般性的建议或经验法则吗

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


EDIT3:最后,一旦我发现了远期包含的怪癖,
auto_ptr
就足以胜任这项工作。还可以尝试为
shared\u ptr
编写一个自定义删除程序,以允许可选地删除指针。

Edit:在我最初的回答中,我不理解
boost::shared\u ptr
对您来说是不可接受的(可能是出于性能原因)

auto_ptr
支持转发声明。您需要将引用类的标题包含在那些可能破坏
自动\u ptr
引用的对象的位置。然而,请注意,
auto_ptr
的语义有点古怪,需要注意

以下问题的答案包含更多信息,包括为什么
unique\u ptr
只能为C++0x实现,因为它需要右值引用:

C++TR1(由现代GCC和visualstudio支持)内置了
共享\u ptr
。这些主要来自于几乎适用于任何现代编译器的Boost


如果您需要严格的所有权,您可以使用一些样板代码检查。这不是一个完美的模仿。例如,您需要两个更明确的
move
调用才能返回本地
unique\u ptr

这正是我使用auto\u ptr的目的。直到我开始使用boost(或者在我无法使用boost的情况下)。它将自定义删除程序添加到一个类似自动\u ptr的界面中。
共享\u ptr
不可接受的原因是因为我需要一个
release()
方法,因为我正在通过引入工厂方法整理一些遗留代码,但它必须与一些手动指针所有权代码共存。在整个代码库中使用
shared\u ptr
会很好,但这是一项艰巨的任务。@the_mandrill:我不认为这是个问题。Boost允许自定义删除程序。您可以为已发布的指针编写一个不可操作的自定义删除程序。如果您编写一个不可操作的自定义删除程序,这是否会阻止它释放指针?或者你是指一个自定义的删除程序,在运行时可以将其切换为删除/不删除?根据_mandrill,这两个选项都不是可行的。共享的\u ptr使用ref计数,作用域的\u ptr不支持发布。