在下面的示例中,当我将 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/