如果我有一个 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::) 中。这意味着您不能拥有 的 STL 容器auto_ptrs
等。 auto_ptr<>
当您将拥有一个对象的一个副本且生命周期有限时,这非常有用。如果您复制到另一个auto_ptr<>
,您将丢失第一个。如果你传递了指针,你就有很大的机会尝试使用一个已经被删除的对象。
您可以根据需要调用SetOponent(*Class);
,因为这将传递实际项目(您将对象而不是指针传递给引用)。如果传递给指针,则可以调用 with SetOpponent(Class.get())
。当 Class 超出范围时,您仍然会遇到 MyClass 将被删除的问题。