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 实现。
感谢您的所有回复。