我正在阅读有关共享指针的一些注释。 他们说STL与auto_ptr的第一次尝试有以下主要缺点:
我理解前两个,但我不确定最后一个意味着什么。
有人可以解释一下。
感谢。
答案 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
的作用:无论您是否想要数据,它都会放弃数据的所有权。