3

在 C++03 环境中,您会使用 anauto_ptr还是 a (boost)shared_ptr从函数返回资源?(在 C++11 中自然会使用unique_ptr.)

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

或者

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

auto_ptr有相当多的陷阱(尤其是它的构造在我必须使用的 MSVC 2005 上非常错误shared_ptr),但似乎有点矫枉过正......

4

3 回答 3

6

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

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

于 2013-02-15T11:09:22.313 回答
1

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

这实际上取决于您的所有权语义。谁将破坏拥有的资源?

于 2013-02-15T11:03:38.440 回答
0

免责声明:这个答案完全适用于 auto_ptr 使用与 VS2005 中的错误实现类似的错误实现。

auto_ptr 在 VS 2005 上尝试后,我将添加自己的视图:

过去,我已经在纯本地上下文中成功使用了 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 用例之外,请远离所有用例。

于 2013-02-19T10:19:33.147 回答