6

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

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

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

有人可以解释一下吗。

谢谢。

4

3 回答 3

10

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

当你有:

void foo(std::auto_ptr<bar> x);

并且您foo使用调用auto_ptr,您制作了auto_ptrforfoo使用的副本。这有效地转移了所有权foo因此指针在完成后被删除foo

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

于 2011-07-31T16:23:12.313 回答
6

基本上,auto_ptr将所有权转移到分配给它的指针。
当您传递auto_ptr给函数时,指针的所有权将转移到函数参数中的接收指针。这个指针的范围是直到函数体,因此当函数退出时指针被删除。

在有效地使用 auto_ptr中阅读它。Herb Sutter 很好地和权威地解释了它。

于 2011-07-31T16:22:56.653 回答
0

数据接收会吸收您的数据并拥有它的所有权。

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

通过类比(和示例),考虑从std::cin(作为源的流)获取数据,进行一些计算,然后将结果推送到std::cout(作为接收器的流)。一旦你完成了,你就完成了;结果已经消失了,您无法将其取回。

就是这样auto_ptr做的:它放弃了您数据的所有权,无论您是否愿意。

于 2019-05-30T10:05:47.237 回答