如果我有auto_ptr,我可以传递它作为参考吗?喜欢:
auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)
auto_ptrs的奇怪复制行为是什么?
答案 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被删除的问题。