auto_ptr或shared_ptr

时间:2013-02-15 11:01:05

标签: c++ shared-ptr auto-ptr visual-c++-2005

在C ++ 03环境中,您是否会使用auto_ptr或(boost)shared_ptr从函数返回资源? (在C ++ 11中,人们自然会使用unique_ptr。)

auto_ptr<T> f() {
  ...
  return new T();
}

shared_ptr<T> f() {
  ...
  return new T();
}

auto_ptr有一些陷阱(至少它的构造是awfully buggy on MSVC 2005这是我必须使用的),但shared_ptr似乎有点过分......

3 个答案:

答案 0 :(得分:6)

在C ++ 03中,我会使用裸指针或auto_ptr,让调用者决定所有权策略。

请注意,智能指针的一个缺陷是协方差不适用于它们,这意味着您可以通过Base* f()覆盖Derived* f(),但不能覆盖{{ 1}} std::x_ptr<Base> f();因此,在这种情况下,你别无选择,只能使用简单的指针。

答案 1 :(得分:1)

我会使用shared_ptr或原始指针,因为auto_ptr被认为是个坏主意。

这实际上取决于您的所有权语义。谁将摧毁自有资源?

答案 2 :(得分:0)

免责声明:此答案纯粹适用于auto_ptr与VS2005中的错误实现一起使用。

在VS 2005 上尝试使用auto_ptr 后,我会添加自己的观点:

我已经在过去的纯本地语境中成功使用了auto_ptr(在这个VC ++ 8上),即:

auto_ptr<T> local( ... ); // Don't use "=" to init! Will Crash on VS2005!
// use local
...
// Sometimes:
m_managing_object.setStuff( local.release() );
// Or, alternatively:
return local.release();

这个工作得很好,唯一可能出错的是使用init的赋值语法,每次都可靠地崩溃,所以这不是什么大问题。

所以,就其他人提到的暗示语义达成一致,我试图让我的初始例子起作用

auto_ptr<T> f() {
  ...
  return new T();
}
...
auto_ptr<T> pT( f() ); // or "=" init??, Variations ...
...

<强>失败!

在大约1小时30分摆弄这个简单的例子之后,我仍然没有找到原因以及每次以这种方式使用时auto_ptr如何崩溃。

我很确定这是由于VS2005的错误实现,也就是说,我可能已经做了一些完全疯狂的事情,一个无错误的实现会抓住但是在这里它崩溃了我没能做到正确

这是什么意思:这意味着我现在使用VS2005和C ++超过5年了,我对调试最奇怪的场景非常有信心,经过一个多小时我仍然仍然没有摆弄我做错了什么。我确信我最终会发现,但如果一件事太容易被滥用,我宁愿使用shared_ptr并完成它。地狱,即使原始指针返回更好,至少你会得到的最糟糕的事情是memleak(易于检测)。

所以:除了VS2005上最简单的auto_ptr使用案例之外,请不要理会。