在下面的例子中,当我将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";。
报价:
允许auto_ptr通过引用传递是非常糟糕的设计,并且应该始终避免它
根据auto_ptrs的概念,可以通过使用常量引用将所有权转移到函数中。
是不是不可能传递聪明的指针,或者我有错误的想法?
是不能传递智能指针还是我有错误的想法
仅适用于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
的复制构造函数在大多数情况下并不昂贵,但在某些情况下可能很重要,因此使用这两种方法中的任何一种都取决于情况。
不能传递std::auto_ptr,但可以传递一个智能指针来管理对它的引用数量,比如boost::shared_ptr。