如何在函数中传递智能指针
How to pass smart pointers in function?
在下面的例子中,当我将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。
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制