C++ 何时使用std::auto_ptr而不是boost::shared_ptr?

C++ 何时使用std::auto_ptr而不是boost::shared_ptr?,c++,stl,boost,shared-ptr,auto-ptr,C++,Stl,Boost,Shared Ptr,Auto Ptr,在我们的所有代码中,我们几乎已经转向使用boost::shared_ptr,但是我们仍然有一些单独的情况,我们使用std::auto_ptr,包括单例类: template < typename TYPE > class SharedSingleton { public: static TYPE& Instance() { if (_ptrInstance.get() == NULL) _ptrInstance.res

在我们的所有代码中,我们几乎已经转向使用
boost::shared_ptr
,但是我们仍然有一些单独的情况,我们使用
std::auto_ptr
,包括单例类:

template < typename TYPE >
class SharedSingleton
{
public: 
    static TYPE& Instance()
    {
        if (_ptrInstance.get() == NULL)
            _ptrInstance.reset(new TYPE);
        return *_ptrInstance;
    }

protected: 
    SharedSingleton() {};

private:
    static std::auto_ptr < TYPE > _ptrInstance;
};
模板
类SharedSingleton
{
公众:
静态类型和实例()
{
if(_ptrInstance.get()==NULL)
_ptrInstance.reset(新型);
返回*\p冲洗液;
}
受保护的:
SharedSingleton(){};
私人:
静态标准::自动\u ptr\u ptrInstance;
};
有人告诉我,这是一个很好的理由,为什么它没有成为一个
共享的\u ptr
,但就我而言,我不明白为什么?我知道在下一个标准中,
auto\u ptr
最终会被标记为折旧,所以我想知道我可以用什么/如何替换这个实现

<> P><强>还有,为什么你会考虑使用<代码> AutoPyTrp/代码>而不是<代码> SyddypTr> /Cord>?<强>,并且你看到将来会有什么问题转移到SyrdYPPTR吗?


编辑:

  • 因此,在回答“我能否安全地将上述代码中的
    auto_ptr
    替换为
    shared_ptr
    ”时,答案是肯定的——不过我会受到一点性能影响
  • auto_ptr
    最终被标记为折旧,我们转到
    std::shared_ptr
    时,我们需要彻底测试代码,以确保遵守不同的所有权语义
    auto_ptr是我使用的唯一一种智能指针。我之所以使用它,是因为我不使用Boost,而且我通常更喜欢面向业务/应用程序的类,而不是显式的 定义删除语义和顺序,而不是依赖于
    智能指针的集合或单个智能指针。

    auto\u ptr
    shared\u ptr
    解决完全不同的问题。一个不能代替另一个

    auto_ptr
    是一个围绕指针的薄包装器,用于实现语义,因此即使遇到异常,资源也总是被释放
    auto_ptr
    根本不执行任何引用计数或类似操作,在创建副本时,它不会使多个指针指向同一对象。事实上,这是非常不同的
    auto_ptr
    是赋值操作符修改源对象的少数类之一。考虑这个无耻的插头:

    不仅修改y,还修改x

    通过使用
    boost::shared_ptr
    模板,可以轻松处理指向同一对象的多个指针,并且该对象只有在最后一次引用超出范围后才会被删除。此功能在您的场景中没有用处,您的场景(尝试)实现了一个。在您的场景中,始终存在对类的唯一对象(如果有的话)的0个引用到1个引用


    本质上,
    auto_ptr
    对象和
    shared_ptr
    对象具有完全不同的语义(这就是为什么不能在容器中使用前者,但在容器中使用后者是可以的),我当然希望您有好的测试来捕获在移植代码时引入的任何回归。:-}

    其他人回答了为什么此代码使用
    自动\u ptr
    而不是
    共享\u ptr
    。要回答您的其他问题:

    我可以用什么/如何替换此实现

    使用<代码> Boo::SCOMPEDYPTR 或<代码> UNQUIGYPTR (在Boost和新C++标准中都可用)。

    scoped_ptr
    unique_ptr
    都提供了严格的所有权(并且没有引用计数开销),并且它们避免了
    auto_ptr
    的意外复制时删除语义

    还有,为什么你会考虑使用<代码> AutoPPTR <代码>而不是使用<代码> SydDypPT/<代码>?您是否认为在将来转到

    共享\u ptr
    时会出现任何问题


    就个人而言,我不会使用
    自动\u ptr
    。复制时删除太不直观了。切换到
    scoped_ptr
    unique_ptr
    shared_ptr
    应该不会有问题。具体来说,
    shared_ptr
    应该是一个替代品,如果您不关心引用计数开销的话<如果您不使用
    auto\u ptr
    的所有权转移功能,code>scoped\u ptr将是一个替代品。如果您使用的是所有权转移,那么
    unique\u ptr
    几乎可以替代,只是您需要显式调用
    move
    来转移所有权。请参见一个例子。

    智能指针是编写C++中安全高效代码的有用工具。如果没有它们,编写无异常、无内存泄漏的程序是非常困难的。auto_ptr(我已经说过我使用过)是一个智能指针!自动ptr并没有那么聪明;-)你不能用它来处理共享资源。因此,您可能已经编写了,或者应该编写自己的ref计数指针,这正是shared_ptr为您所做的。我发现除了auto_ptr之外,不要使用任何智能指针是一个非常糟糕的建议。我的建议正好相反,因为auto_ptr被赋予了两项职责:确保无论我们如何离开范围,它都被正确地销毁,以及安全地将对象从一个位置转移到另一个位置。应该改为使用共享资源或唯一资源。我不相信共享资源。资源应该属于一个类的一个实例。我没有建议不要使用任何其他类型的智能指针-我描述了我所做的。关于横切关注点、上下文对象、共享数据、优化策略、硬件接口等等,我会怎么做Sauto_ptr正在被取代,主要是因为它如何处理移动语义,因为在这种情况下,维护向后兼容性比更新它更干净。新类应该是*交叉的
    int *i = new int;
    auto_ptr<int> x(i);
    auto_ptr<int> y;
    
    y = x;
    
    cout << x.get() << endl; // Print NULL
    cout << y.get() << endl; // Print non-NULL address i
    
    y = x;