首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将auto_ptr传递给函数实际上使其成为一个接收器。为什么?

将auto_ptr传递给函数实际上使其成为一个接收器。为什么?
EN

Stack Overflow用户
提问于 2011-07-31 16:19:56
回答 3查看 4.2K关注 0票数 6

我正在读一些关于共享指针的笔记。他们说,STL第一次尝试使用auto_ptr有以下主要缺点:

  • 它们不能用于STL容器
  • 复制auto_ptr传输所有权
  • 将auto_ptr传递给函数有效地使其成为接收器

我理解前两个,但我不知道最后一个是什么意思。

有人能解释一下吗。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-31 16:23:12

这是因为一旦将auto_ptr复制到变量中,就会失去指向新变量的指针的所有权。

当你有:

代码语言:javascript
复制
void foo(std::auto_ptr<bar> x);

你用一个foo调用auto_ptr,你做一个auto_ptr的副本供foo使用,这有效地将所有权传递给foo,因此在foo完成后指针就被删除了。

这是一个非常令人惊讶的行为,使我最终停止使用auto_ptr。对于try块中的简单RAII ( auto_ptr的主要用例,如书中所述),使用boost::scoped_ptr

票数 10
EN

Stack Overflow用户

发布于 2011-07-31 16:22:56

基本上,auto_ptr将所有权传递给分配给它的指针。

当您将auto_ptr传递给函数时,指针的所有权将在函数参数中传递给接收指针。该指针的作用域仅限于函数的主体,因此在函数退出时指针将被删除。

http://www.gotw.ca/publications/using_auto_ptr_effectively.htm上读到它。赫伯·萨特很好地解释了这一点&权威。

票数 6
EN

Stack Overflow用户

发布于 2019-05-30 10:05:47

数据沉槽是吸收您的数据,获取它的所有权的东西。

术语起源于“管道”的概念,在这种概念中,实体链中的某个特定实体从“源”获取其数据,然后将其结果推到“接收器”。链中的下一个实体做同样的事情,依此类推。在每个阶段,实体都不能对传递的数据做任何事情。

通过类比(和示例),考虑从std::cin (充当源的流)获取数据,然后进行一些计算,然后将结果推到std::cout (充当接收器的流)。一旦你完成了,你就完成了;结果就在第二阶段,你无法把它们拿回来。

这就是auto_ptr所做的:不管您是否愿意,它都会将数据的所有权公之于众。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6890656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档