9

std::auto_ptr在 VC++ 8 中被破坏(这是我们在工作中使用的)。我对它的主要抱怨是它允许auto_ptr<T> 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网上的东西。就像Rani Sharoni 的这个(还没试过)。
  • 改为使用boost::shared_ptr。当然会起作用,尽管会有一些我不关心的小开销。但我想用auto_ptr指针的意图来表示。(有关此方法的投票,请参阅答案。)
  • 在实践中我永远不需要传递所有权,所以我不应该担心这个。

更新:这是我所做的:我复制了 Rani Sharoni 的上述 auto_ptr 实现。从这里

做了一些小测试:

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 实现。

感谢您的所有回复。

4

7 回答 7

7

移动以增强智能指针。

同时,您可能希望从旧的/另一个 STL 中提取工作的 auto_ptr 实现,这样您就有工作代码。

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

unique-ptr “修复”,通过使 release 不仅放弃所有权,而且将 RHS 设置为空。它是最接近 auto-ptr 的替代品,但由于其不同的语义,它不是直接替代品。

有一篇关于提升智能指针的介绍性文章,作者,咳咳,我。

于 2008-11-07T09:47:14.437 回答
3

您是否考虑过使用STLPort

于 2008-11-06T22:01:30.523 回答
2

使用 unique_ptr。我认为这些被引入是为了更好的 auto_ptr。

http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/interprocess_smart_ptr.html#interprocess.interprocess_smart_ptr.unique_ptr

事实上,我被认为可能会弃用 auto_ptr 以支持它:

http://objectmix.com/c/113487-std-auto_ptr-deprecated.html

于 2008-11-06T22:04:03.777 回答
1

你为什么认为 std::auto_ptr<> 坏了。

我本来会向标准委员会报告那样糟糕的事情!

你的意思是你需要:

std::auto_ptr<T>   x(new T);  // Use the explicit constructor.
于 2008-11-06T21:30:17.543 回答
0

使用 boost::shared_ptr/boost::scoped_ptr。它将成为即将推出的 C++ 标准中的首选智能指针(已经在 TR1 中)。

编辑:请在此处找到相关讨论:Idiomatic use of std::auto_ptr or only use shared_ptr?

于 2008-11-06T21:30:12.007 回答
0

据我记得,不是吗:

auto_ptr<T> x = auto_ptr<T>(new T()); ??
于 2009-08-06T07:28:22.050 回答
0

不是答案,而是出于与这些错误相关的任何人的普遍利益。还有一个与VC8相关的错误auto_ptr,它与隐式向上转换有关。这可能是最邪恶的,因为其他错误只会让您编译根据标准非法的代码而不会失败,但至少兼容的代码可以正常工作。有了这个错误,实际上合规的代码就不能正常工作。

问题是这样的。标准auto_ptr以支持 s 的隐式向上转换的方式指定构造函数和转换运算符auto_ptr,就像使用普通指针一样。但是,VC8 实现了一个reinterpret_cast而不是一个static_cast。自然,这不仅是标准字母上的 UB,而且它还与多个基类和/或虚拟继承相冲突。这是一个由此破坏的法律代码示例:

struct Base1 { int x; };
struct Base2 { int y; };
struct Derived : Base1, Base2 {};

std::auto_ptr<Derived> createDerived()
{
  return std::auto_ptr<Derived>(new Derived);
}

std::auto_ptr<Base2> base2(createDerived());

在我过去的一项工作中,当我们在生产中遇到这个问题时,我们最终只是自己修补了标题(这是一个微不足道的 2 行修复)。

于 2009-08-06T07:42:30.993 回答