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

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

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

有帮助吗?

解决方案

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

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传递给函数,或者尝试将它们存储在标准库容器中。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top