免责声明:这个答案完全适用于 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 用例之外,请远离所有用例。