【发布时间】:2010-03-21 09:57:48
【问题描述】:
下面的函数是否OK:
void DoSomething(auto_ptr< … >& a)....
【问题讨论】:
标签: c++ smart-pointers auto-ptr
下面的函数是否OK:
void DoSomething(auto_ptr< … >& a)....
【问题讨论】:
标签: c++ smart-pointers auto-ptr
你可以这样做,但我不确定你为什么要这样做。
如果您使用 auto_ptr 来指示 ptr 的所有权(正如人们通常所做的那样),那么如果您想将 ptr 的所有权转移给函数,则只需将 auto_ptr 传递给函数,在这种情况下您将通过值传递 auto_ptr:
void DoSomething(auto_ptr<int> a)
所以任何调用 DoSomething 的代码都会放弃 ptr 的所有权:
auto_ptr<int> p (new int (7));
DoSomething (p);
// p is now empty.
否则只通过值传递ptr:
void DoSomething(int* a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (p.get ());
// p still holds the ptr.
或将 ref 传递给指向的对象:
void DoSomething(int& a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (*p);
// p still holds the ptr.
第二个通常更可取,因为它更明确地表明 DoSomething 不太可能尝试删除对象。
【讨论】:
auto_ptr,也有人可以调用delete ptr.get(),这会更糟。按值传递指针不会传递有关所有权转移或正确删除形式的信息,因此 - 在没有相反的文档的情况下 - 我不希望被调用者删除指向的对象。