从answer到另一个问题stackoverflow:
Note that the implementation of std::auto_ptr in Visual Studio 2005 is horribly broken.
07001
07002
我想用
> boost :: scoped_ptr,用于不应该通过所有权的指针.
> boost :: shared_ptr,用于容器和其他需要的地方的指针.
> std :: auto_ptr,用于应该/可以传递所有权的指针.
但是由于std :: auto_ptr对我来说是坏的,我想知道最好的方法是什么:
>将std :: auto_ptr替换为来自网络的东西.像这个this一个来自Rani Sharoni(还没有尝试过).
>改用boost :: shared_ptr.当然会工作,虽然会有一些较小的开销,我不在乎.但是我想使用auto_ptr来表示指针的意图. (见this答案就此方式进行投票.)
>我在实践中永远不需要通过所有权,所以我不用担心.
更新:
这是我做的:
我复制了Rani Sharoni所提到的auto_ptr实现. From here.
做了一些小的测试:
class T { public: T() { OutputDebugStringA("T\n"); }; ~T() { OutputDebugStringA("~T\n"); }; }; { fix::auto_ptr<T> x(new T); // This just works. } { fix::auto_ptr<T> x = (new T); // Doesn't compile. Great! } { fix::auto_ptr<T> x = fix::auto_ptr<T>(new T); // Transfer of ownership works also. }
当然,这些测试并不是详尽的,你不应该相信他们.实施一个异常安全的模板类是有毛皮的业务.至少这比内置的更好.
注意:关于版权,我不知道我是否被允许使用这个实现.我已经通过电子邮件发送给Rani,我正在等待回复.当我知道更多时,我会更新这篇文章.
允许所有人按照您的愿望使用Rani Sharoni的auto_ptr实现.
谢谢你的回复.
解决方法
在此期间,您可能希望从旧的/另一个STL中提取一个工作的auto_ptr实现,因此您有工作代码.
我相信auto_ptr语义基本上是破碎的 – 它可以保存打字,但是界面实际上并不简单:您还需要跟踪当前所有者的哪个实例,并确保所有者离开最后.
unique-ptr“修复”,通过发布不仅放弃所有权,而且将RHS设置为null.它是auto-ptr的最接近的替代品,但它具有不同的语义,它不是一个替代品.
有一个介绍性的文章boost smart pointers,由,我,我.