引用和auto_ptr

时间:2009-04-29 15:02:20

标签: c++ reference auto-ptr

如果我有auto_ptr,我可以传递它作为参考吗?喜欢:

auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)

auto_ptrs的奇怪复制行为是什么?

2 个答案:

答案 0 :(得分:4)

不,你不能,你必须取消引用它:

SetOponent( * Class )

至于复制行为,我建议你阅读一本关于C ++的好书,例如Scott Meyers的Effective C ++。 auto_ptr的复制行为非常不直观,可能超出了SO答案的范围。然而,没有什么冒险的......

复制auto_ptr时,所有权将从原始文件传输到副本。例如:

auto_ptr <Foo> p1( new Foo ); 

此时p1拥有指向Foo对象的指针。

auto_ptr <Foo> p2( p1 ); 

复制后,p2拥有指针并且 p1被更改,以便它现在保存一个NULL指针。这很重要,因为复制发生在C ++的很多地方。例如,您不应该通过值将auto_ptrs传递给函数,或者尝试将它们存储在标准库容器中。

答案 1 :(得分:1)

奇怪的复制行为是你无法复制并仍然拥有原件。使用shared_ptr(在boost ::或std :: tr1::)中。这意味着您不能拥有auto_ptrs的STL容器等。 auto_ptr<>对于拥有一个有限生命周期的对象副本非常有用。如果您复制到另一个auto_ptr<>,则会丢失第一个SetOponent(*Class);。如果你传出指针,你很有可能尝试使用已被删除的对象。

如果您愿意,可以调用SetOpponent(Class.get()),因为它会传递实际项目(您将对象,而不是指针传递给引用)。如果您传递给指针,则可以使用{{1}}进行调用。当Class超出范围时,你仍然会遇到MyClass被删除的问题。