将auto_ptr有效地传递给函数使其成为接收器。为什么?

时间:2011-07-31 16:19:56

标签: c++ auto-ptr

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

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

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

有人可以解释一下。

感谢。

4 个答案:

答案 0 :(得分:10)

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

当你有:

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

如果您使用foo致电auto_ptr,则会复制auto_ptr以使用foo。这有效将所有权转移到foo,因此在foo完成后指针会被删除。

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

答案 1 :(得分:6)

基本上,auto_ptr将所有权转移到指定的指针 将auto_ptr传递给函数时,指针的所有权将传递给函数参数中的接收指针。此指针的范围仅限于函数体,因此当函数退出时指针将被删除。

Using auto_ptr Effectively 中了解相关信息。 Herb Sutter很好地解释了它权威性。

答案 2 :(得分:0)

您可以直接通过以下方式传递指针:

void foo(x.get());

答案 3 :(得分:0)

数据sink会占用您的数据并拥有所有权。

该术语起源于“管道”的概念,在该概念中,一系列实体中的某个特定实体从“源”获取其数据,然后将其结果推送到“接收器”。链中的下一个实体执行相同的操作,依此类推。在每个阶段,实体都无法对传递的数据做任何事情。

通过类比(和举例),考虑从std::cin(充当源的流)中获取数据,进行一些计算,然后将结果推入std::cout(充当宿的流)。一旦完成,就完成了;结果出乎意料,您无法将它们找回来。

这就是auto_ptr的作用:无论您是否想要数据,它都会放弃数据的所有权。

相关问题