2009-04-29 45 views
1

如果我有一个的auto_ptr我可以通过它的参考像:参考和auto_ptr的

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

什么是auto_ptr对象奇复制行为?

+0

不知道为什么这是社区维基... – 2009-04-29 15:04:43

+0

Doug,为什么不o_O – 2009-04-29 19:26:23

回答

4

,你不行,你就必须取消对它的引用:

SetOponent(* Class) 

至于复制行为,我建议你阅读C++,如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给函数,或者试图将它们存储在标准库容器中。

+2

我想你可以通过值传递一个auto_ptr函数,如果你想传递指针的所有权的功能。 – markh44 2009-04-30 08:42:47

1

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

如果您愿意,您可以调用SetOponent(*Class);,因为它会传递实际项目(您传递对象,而不是指针)。如果您传递给指针,您可以拨打SetOpponent(Class.get())。当Class超出范围时,您仍然会遇到MyClass将被删除的问题。