在VC 8中替换auto_ptr

在VC 8中替换auto_ptr,第1张

概述std :: auto_ptr在VC 8中被破坏(这是我们在工作中使用的).我的主要抱怨是它允许auto_ptr< T> x = new T();这当然会导致可怕的崩溃,而很容易做错误. 从answer到另一个问题stackoverflow: Note that the implementation of std::auto_ptr in Visual Studio 2005 is horribl std :: auto_ptr在VC 8中被破坏(这是我们在工作中使用的).我的主要抱怨是它允许auto_ptr< T> x = new T();这当然会导致可怕的崩溃,而很容易做错误.

从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实现.

谢谢你的回复.

@H_404_37@解决方法 移动以提高智能指针.

在此期间,您可能希望从旧的/另一个STL中提取一个工作的auto_ptr实现,因此您有工作代码.

我相信auto_ptr语义基本上是破碎的 – 它可以保存打字,但是界面实际上并不简单:您还需要跟踪当前所有者的哪个实例,并确保所有者离开最后.

unique-ptr“修复”,通过发布不仅放弃所有权,而且将RHS设置为null.它是auto-ptr的最接近的替代品,但它具有不同的语义,它不是一个替代品.

有一个介绍性的文章boost smart pointers,由,我,我.

@H_404_37@ @H_404_37@ 总结

以上是内存溢出为你收集整理的在VC 8中替换auto_ptr全部内容,希望文章能够帮你解决在VC 8中替换auto_ptr所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1252075.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存