当前位置:  开发笔记 > 编程语言 > 正文

在VC++ 8中替换auto_ptr

如何解决《在VC++8中替换auto_ptr》经验,为你挑选了1个好方法。

std::auto_ptr在VC++ 8(这是我们在工作中使用的)中被破坏了.我对它的主要抱怨是,它允许auto_ptr x = new T();,当然导致可怕的崩溃,而错误地做的很简单.

从stackoverflow上的另一个问题的答案:

请注意,Visual Studio 2005中std :: auto_ptr的实现严重受损. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842

我想用

boost::scoped_ptr,对于不应该通过所有权的指针.

boost::shared_ptr,用于容器中的指针以及需要它们的其他地方.

std::auto_ptr,对于应该/可以通过所有权的指针.

但是因为std::auto_ptr对我而言是破碎的,我想知道什么是最好的方法:

std::auto_ptr网上的东西替换.像这样这一个从拉尼Sharoni(还没有尝试过呢).

boost::shared_ptr改用.当然会工作,虽然会有一些我不关心的小开销.但我想用它auto_ptr来表示指针的意图.(有关此方法的投票,请参阅此答案.)

我永远不需要在实践中通过所有权,所以我不应该担心这一点.


更新:这就是我所做的:我复制了Rani Sharoni提到的auto_ptr实现.从这里开始.

做了一些小测试:

class T
{
public:
    T() {
        OutputDebugStringA("T\n");
    };
    ~T() {
        OutputDebugStringA("~T\n");
    };
};

{
    fix::auto_ptr x(new T); // This just works.
}
{
    fix::auto_ptr x = (new T); // Doesn't compile. Great!
}
{
    fix::auto_ptr x = fix::auto_ptr(new T); // Transfer of ownership works also.
}

当然,这些测试并非详尽无遗,您不应该相信它们.实现异常安全模板类是毛茸茸的业务.至少这比内置的更好.

注意:关于版权,我不知道是否允许我使用此实现.我已经通过电子邮件发送了Rani,我正在等待回复.当我知道更多时,我会更新这篇文章. 允许每个人使用Rani Sharoni的auto_ptr实现的权限.

谢谢你的回复.



1> peterchen..:

移动以提升智能指针.

与此同时,您可能希望从旧的/另一个STL中提取有效的auto_ptr实现,因此您可以使用有效的代码.

我相信auto_ptr语义从根本上被打破 - 它节省了输入,但实际上界面并不简单:你仍然必须跟踪哪个实例是当前所有者并确保所有者离开最后.

unique-ptr"修复",通过释放不仅放弃所有权,而且还将RHS设置为null.它是auto-ptr的最接近的替代品,但由于其不同的语义,它不是替代品.

有一篇介绍性的文章来提升智能指针,嗯,我.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有