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_ptr
s可以拥有一个对象.一个
shared_ptr
要离开并不一定删除它指向的,因为有可能是另一个对象shared_ptr
拥有的对象.shared_ptr
拥有一个对象并消失的最后一个将删除它拥有的对象.
scoped_ptr
实现独占所有权语义.只有一个人
scoped_ptr
可以拥有任何一个对象.当一个scoped_ptr
消失时,它将始终删除它拥有的对象(因为只有一个所有者).它通常用作在免费商店中分配的对象的轻量级RAII机制.
数组版本(shared_array
和scoped_array
)具有基本相同的语义,但是专门为数组设计,例如它们使用delete[]
而不是delete
,实现数组下标运算符等.
shared_ptr
shared_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
.
归档时间: |
|
查看次数: |
3686 次 |
最近记录: |