关于shared_ptr,scoped_ptr和shared_array的一些问题

fex*_*fex 1 c++ boost pointers shared-ptr scoped-ptr

我有一些关于在boost库中实现的智能指针的问题.是shared_ptr的和scoped_ptr的没有拷贝构造函数和shared_ptr的有它scoped_ptr的之间的唯一diffrence?当对象不调用复制构造函数时,我应该总是使用scoped_ptr而不是shared_ptr吗?我也不明白共享/作用域数组的想法.我不能只使用std :: vector而不是它吗?

In *_*ico 10

是shared_ptr的和scoped_ptr的没有拷贝构造函数和shared_ptr的有它scoped_ptr的之间的唯一diffrence?

差异比这更基本; 它与智能指针如何拥有它指向的对象有关.使智能指针与哑指针不同的是,所有权的概念是其功能的核心组成部分.所有权语义是区分不同类型智能指针的原因.

因为智能指针"拥有"他们所指向的东西,所以当智能指针消失时,他们可以做一些有用的事情,比如删除对象(这只能使用语言规则;不需要编译器魔法).这样,内存管理几乎可以在C++中自动完成(尽管声称相反,现代C++中只需要很少的手动内存管理).

  • shared_ptr实现内存管理的引用计数语义.多个shared_ptrs可以拥有一个对象.一个 shared_ptr要离开并不一定删除它指向的,因为有可能是另一个对象shared_ptr拥有的对象.shared_ptr拥有一个对象并消失的最后一个将删除它拥有的对象.

  • scoped_ptr实现独占所有权语义.只有一个人 scoped_ptr可以拥有任何一个对象.当一个scoped_ptr消失时,它将始终删除它拥有的对象(因为只有一个所有者).它通常用作在免费商店中分配的对象的轻量级RAII机制.

数组版本(shared_arrayscoped_array)具有基本相同的语义,但是专门为数组设计,例如它们使用delete[]而不是delete,实现数组下标运算符等.

shared_ptrshared_array如果默认delete行为不适合该对象,还允许您指定自定义删除器.scoped_ptr而且scoped_array没有那种能力,因为与shared_ptr和相比,它们相当轻巧shared_array.

在C++ 11中,最新和当前版本的C++,还有一个unique_ptr,scoped_ptr除了你可以将对象的所有权转移到另一个对象之外unique_ptr.在C++ 03,旧的但更广泛的支持版本的C++的,还有auto_ptr这相当于unique_ptr除了它很容易误用它以不安全的方式(这就是为什么它被弃用C++ 11).

当对象不调用复制构造函数时,我应该总是使用scoped_ptr而不是shared_ptr吗?

您选择哪一个不依赖于复制构造函数的存在,因为shared_ptr并且scoped_ptr不要求该对象是可复制构造的.您可以根据所需的所有权语义选择一个.如果对象将拥有多个所有者,则使用shared_ptr.如果对象只有一个所有者且对象的存在仅在范围内,则使用scoped_ptr(因此名称scoped_ptr).

我也不明白共享/作用域数组的想法.我不能只使用std :: vector而不是它吗?

std::vector没有像你shared_array那样实现引用计数语义.std::vector更像是scoped_array,但可以复制.复制a时std::vector,还会复制其包含的所有元素.事实并非如此scoped_array.std::vector也有功能,让您操作和检查其内容(例如push_back,insert,erase等),但比更重量级的scoped_array.