Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该停止使用auto_ptr吗?_C++ - Fatal编程技术网

C++ 我应该停止使用auto_ptr吗?

C++ 我应该停止使用auto_ptr吗?,c++,C++,我最近开始欣赏std::auto_ptr,现在我读到它将是。我开始在两种情况下使用它: 工厂的返回值 通信所有权转移 示例: // Exception safe and makes it clear that the caller has ownership. std::auto_ptr<Component> ComponentFactory::Create() { ... } // The receiving method/function takes ownership o

我最近开始欣赏std::auto_ptr,现在我读到它将是。我开始在两种情况下使用它:

  • 工厂的返回值
  • 通信所有权转移
示例:

// Exception safe and makes it clear that the caller has ownership.
std::auto_ptr<Component> ComponentFactory::Create() { ... }

// The receiving method/function takes ownership of the pointer. Zero ambiguity.
void setValue(std::auto_ptr<Value> inValue);
//异常安全,并明确调用方拥有所有权。
std::auto_ptr ComponentFactory::Create(){…}
//接收方法/函数拥有指针的所有权。零歧义。
无效设置值(标准::自动失效);
尽管复制语义有问题,但我发现
auto_ptr
很有用。对于上面的例子,似乎没有其他选择


我是否应该继续使用它,然后切换到
std::unique\u ptr
?还是应该避免使用它?

我建议您使用boost智能指针。

它非常有用,尽管有缺陷,我强烈建议您继续使用它,并在可用时切换到
unique\u ptr

::std::unique_ptr
需要一个支持右值引用的编译器,右值引用是C++0x标准草案的一部分,并且需要一段时间才能真正获得广泛的支持。在右值引用可用之前,
::std::auto_ptr
是最好的选择


在代码中同时包含
::std::auto_ptr
::std::unique_ptr
可能会让一些人感到困惑。但当您决定更改时,应该能够搜索并替换
::std::unique_ptr
。如果这样做,可能会出现编译器错误,但它们应该很容易修复。排名靠前的答案有更多的细节。

不推荐并不意味着它会消失,只是会有更好的选择


我建议在当前代码中继续使用它,但在新代码中使用新的替代方法(新程序或模块,而不是对当前代码进行小的更改)。一致性很重要

它们不能解决相同的问题。Boost并不是万能的,不管它有多有用。Boost智能指针会承担一定的开销。共享的\u ptr需要额外的内存分配,而入侵的\u ptr需要一个嵌入式计数器。现在还没有什么好的替代品可以替代auto_ptr。正如Omni所说。boost的智能指针都不支持所有权转移,因为标准库已经提供了当前标准中可能提供的功能。如果
std::auto_ptr
起作用,使用boost的任一共享指针几乎肯定是一个错误[
boost::scoped_ptr
可能就足够了,但这些情况相对有限]我已经在使用boost智能指针了。对于本地变量和成员变量,我使用作用域\u ptr,用于共享\u ptr的容器。但是,这些并不能“沟通”所有权转移。@Maxim Yegorushkin-有时,使用boost::make_shared可以绕过额外的分配。我要说的是,无论你在做什么项目,都要坚持使用
auto_ptr
,并且在开始新项目时切换,这样你就不会因为将它们混合在一起而造成复杂性。(我假设您使用的编译器支持
unique\u ptr
std::auto\u ptr
被弃用,不是因为它没有用处,而是因为
std::unique\u ptr
做了它已经做过的一切,只是做得更好。因此,无论您是否切换到
std::unique_ptr
,都没有理由停止使用
std::auto_ptr
。这是一个有趣的读物:@Mike:我真的不明白这是怎么回事。所以COM refcounting是一团乱,他写了一些非法代码,当他还涉及(写得很糟糕的)智能指针时,这些代码恰好爆炸了。几乎没有告诉我们关于S明智的C++类中使用的明智指针类。@ Jalf嘿,我不知道。我只是在添加一些信息。但在一个项目中保持一致。没有什么比两种类型做相同的事情但名称不同更糟糕的了。从技术上讲,
unique\u ptr
并不能替代
auto\u ptr
。除此之外,它还将可能的运行时崩溃更改为明确的编译器错误。这通常是一件好事,所以一旦可用,您可能会希望执行find-replace,修复由此触发的任何编译器错误。见@Brian-谢谢你的链接。我将在上午的回答中包括您的澄清和该链接。:-)但这确实意味着它可能在未来某个时候消失。