我正在阅读一些关于共享指针的注释。他们说 STL 首次尝试使用 auto_ptr 有以下主要缺点:
- 它们不能在 STL 容器中使用
- 复制 auto_ptr 转移所有权
- 将 auto_ptr 传递给函数有效地使其成为接收器
我理解前两个,但不确定最后一个是什么意思。
有人可以解释一下吗。
谢谢。
这是因为一旦将 复制auto_ptr
到变量中,您就失去了指向新变量的指针的所有权。
当你有:
void foo(std::auto_ptr<bar> x);
并且您foo
使用调用auto_ptr
,您制作了auto_ptr
forfoo
使用的副本。这有效地转移了所有权,foo
因此指针在完成后被删除foo
。
这是一个非常令人惊讶的行为,让我彻底停止使用auto_ptr
. 对于try
块内的简单 RAII(如书籍中所述的主要用例auto_ptr
),请使用boost::scoped_ptr
.
基本上,auto_ptr
将所有权转移到分配给它的指针。
当您传递auto_ptr
给函数时,指针的所有权将转移到函数参数中的接收指针。这个指针的范围是直到函数体,因此当函数退出时指针被删除。
在有效地使用 auto_ptr中阅读它。Herb Sutter 很好地和权威地解释了它。
数据接收器会吸收您的数据并拥有它的所有权。
该术语起源于“管道”的概念,其中实体链中的某些特定实体从“源”获取数据,然后将其结果推送到“接收器”。链中的下一个实体做同样的事情,依此类推。在每个阶段,实体都不能再对它传递的数据做任何事情。
通过类比(和示例),考虑从std::cin
(作为源的流)获取数据,进行一些计算,然后将结果推送到std::cout
(作为接收器的流)。一旦你完成了,你就完成了;结果已经消失了,您无法将其取回。
就是这样auto_ptr
做的:它放弃了您数据的所有权,无论您是否愿意。