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;