gpt4 book ai didi

c++ - 替换 VC++ 8 中的 auto_ptr

转载 作者:可可西里 更新时间:2023-11-01 16:35:21 27 4
gpt4 key购买 nike

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. 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用网上的东西。像这样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 “修复”了这个问题,通过使 release 不仅放弃所有权,而且还将 RHS 设置为 null。它是 auto-ptr 最接近的替代品,但由于其不同的语义,它不是直接替代品。

boost smart pointers 有介绍文章, 咳咳,我。

关于c++ - 替换 VC++ 8 中的 auto_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com