如果我有一个的auto_ptr我可以通过它的参考像:参考和auto_ptr的
auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)
什么是auto_ptr对象奇复制行为?
如果我有一个的auto_ptr我可以通过它的参考像:参考和auto_ptr的
auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)
什么是auto_ptr对象奇复制行为?
,你不行,你就必须取消对它的引用:
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给函数,或者试图将它们存储在标准库容器中。
我想你可以通过值传递一个auto_ptr函数,如果你想传递指针的所有权的功能。 – markh44 2009-04-30 08:42:47
奇怪的复制行为是,你不能复制,仍然有原件。使用shared_ptr
(在boost ::或std :: tr1::)中。这意味着您不能拥有auto_ptrs
等STL容器。 auto_ptr<>
是非常有用的,当你将有一个对象的副本,有限的生命周期。如果您复制到另一个auto_ptr<>
,则失去第一个。如果你传递指针,你有很大的机会尝试使用已经被删除的对象。
如果您愿意,您可以调用SetOponent(*Class);
,因为它会传递实际项目(您传递对象,而不是指针)。如果您传递给指针,您可以拨打SetOpponent(Class.get())
。当Class超出范围时,您仍然会遇到MyClass将被删除的问题。
不知道为什么这是社区维基... – 2009-04-29 15:04:43
Doug,为什么不o_O – 2009-04-29 19:26:23