c++ - 如何在函数中传递智能指针?

标签 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
}

我还从“The C++ Standard Library - Reference by Nicolai M. Josuttis”一书中得知通过引用传递智能指针是非常糟糕的设计。

引用:

Allowing an auto_ptr to pass by reference is very bad design and you should always avoid it .....

..... According to the concept of auto_ptrs, it is possible to transfer ownership into a function by using a constant reference.

是不是不能传递智能指针还是我理解错了?

最佳答案

是不能传递智能指针还是我理解错了?
它仅适用于 auto_ptr。此外,根据新的 C++11 标准,auto_ptr 已弃用,如果您使用的是 c++11,unique_ptr 是更好的选择。

auto_ptr 模板类确保它指向的对象在控制离开作用域时自动销毁,如果您传递 auto_ptr 按值 在函数中,一旦函数作用域结束,对象就会被删除。所以本质上,您将指针的所有权转移给函数,并且您不拥有函数调用之外的指针。

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


unique_ptr 的情况下,如果您将 unique_ptr 传递给按值 函数,那么您就是转让所有权 函数的 unique_ptr

如果您unique_ptr 的引用传递给函数,如果您只是想让函数使用指针,但您没有 想要将它的所有权传递给函数。


shared_ptr 在引用计数机制上运行,因此计数总是在调用复制函数时递增,而在调用析构函数时递减。

通过引用传递 shared_ptr 避免调用任何一个,因此它可以通过引用传递。虽然按值传递它会适本地增加和减少计数,但 shared_ptr 的复制构造函数在大多数情况下并不是很昂贵,但在某些情况下可能很重要,因此使用两者之一取决于情况。

关于c++ - 如何在函数中传递智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155928/

相关文章:

c++ - C++ 中的容器与智能指针

c++ - 将焦点转移到控制台 opencv c++

C++ 求函数的根

c++ - 如何使用 C++ 在函数中添加 double ?

c++ - 智能指针和派生类

c++ - unique_ptr, qvector.resize() 抛出错误 2280 试图引用已删除的函数

c++ - 给定两个偶数,求出它们之间所有偶数的平方和

c++ - QtConcurrent:为什么releaseThread和reserveThread会导致死锁?

c++ - 当一个对象保证比其包含的对象长寿时,应该如何存储该对象?

c++ - 智能指针( boost )解释