如何在功能中传递智能指针?

use*_*635 2 c++ smart-pointers

在下面的例子中,当我传递p给一个函数时,它会在函数func退出后立即被销毁

void func(std::auto_ptr<int> p)
{
   // deletes p
}

int main()
{
    std::auto_ptr<int> p(new int);
    func(p);
    *p = 1; // run-time error
}
Run Code Online (Sandbox Code Playgroud)

我还被告知,通过引用传递智能指针是"The C++ Standard Library - Nicolai M. Josuttis的参考"一书中非常糟糕的设计.

引用:

允许auto_ptr通过引用传递是非常糟糕的设计,你应该总是避免它.....

..... 根据auto_ptrs的概念,可以通过使用常量引用将所有权转移到函数中.

是不是可以通过智能指针或我有错误的想法?

Alo*_*ave 7

是不是可以通过智能指针或我有错误的想法?
它只适用于auto_ptr.此外,根据新的C++ 11标准auto_ptr不推荐使用,unique_ptr如果您使用的是c ++ 11 ,则它是更好的选择.

auto_ptr模板类确保它指向在控制离开范围如果通过被自动销毁,对象auto_ptr 通过值的函数,一次函数的范围结束对象被删除.所以基本上你指针的所有权转移到函数,你没有超出函数调用的指针.

传递auto_ptr引用被认为是一种糟糕的设计,因为auto_ptr它专门用于转移所有权并通过引用传递它意味着该函数可能会或可能不会接管传递指针的所有权.


在情况下unique_ptr,如果你传递一个unique_ptr到函数的值,那么你正在过户unique_ptr到的功能.

如果你是传递一个参考unique_ptr给函数,如果,你只是希望函数使用指针,但你希望通过它的所有权的功能.


shared_ptr 对引用计数机制进行操作,因此在调用复制函数时计数总是递增,而在对析构函数进行调用时递减.

传递shared_ptr引用可以避免对任一个的调用,因此可以通过引用传递它.虽然通过值适当地递增并递减计数,但复制构造函数对于shared_ptr大多数情况来说并不是非常昂贵,但在某些情况下它可能很重要,因此使用两者中的任何一个取决于情况.