c++ auto_ptr 在传入函数时销毁

c++ auto_ptr destroyed when passed into a function

假设我们有

void UsePointer (auto_ptr <CSomeClass> spObj)
{
    spObj->DoSomething();
}

我们有一个主要功能:

int main()
{
    auto_ptr <CSomeClass> spObject (new CSomeClass ());
    UsePointer (spObject);
    // spObject->DoSomthing (); would be invalid.
}

书上说“对象在 UsePointer() 返回时被销毁,因为变量 spObj 超出范围,因此被销毁”

我的问题是:

  1. 传入UsePointer函数时是否复制了指针?因此所有权转移了?
  2. 想要spObject不被销毁需要做什么?我需要通过引用传递这个指针吗?

此外,这本书有点过时了 - C++ 11 中的 unique_ptr 是否也是如此?

Is the pointer copied when passed into UsePointer function? Hence the owernship is transferred?

是的。除非函数参数是引用限定的,否则参数按值传递。 auto_ptr 涉及复制,从而传递所有权。

What do I need to if want spObject not be destroyed? Do I need to pass this pointer by reference?

你可以。但更好的是,传递对对象本身的引用。除非涉及对所有权的操纵,否则函数不应接受智能指针。如果它只是需要用 pointee 做一些事情,接受一个 CSomeClass const& 并传递 *spObject.

Also this book is a bit outdated - does the same hold for unique_ptr in c++ 11?

是的。不同之处在于 unique_ptr 不可复制,因此不能隐含地传递其所有权。要传递 unique_ptr,必须显式移动它。 std:move 在将指针传递给函数的代码中的出现给出了所有权更改的明确视觉提示。