您的位置:首页 > 其它

stl智能指针和boost智能指针对比

2015-12-14 20:15 363 查看
先说说stl中的智能指针auto_ptr,先说说auto_ptr的特点。std::auto_ptr用来管理单个堆内存对象,但是独享所有权,且不允许赋值和拷贝(没有重载operator=),所以如果在函数内部需要指针时,auto_ptr是一个不错的选择,但需要注意的是它不容许复制,这也就是容器(vector,list等)中的元素类型不能是auto_ptr。一般的用法是

std::auto_ptr<server_t> server = std::auto_ptr<server_t>(new server_t());
再看看boost中的指针。boost中有scoped_ptr、scoped_array、shared_ptr 、shared_array和weak_ptr 这5种类型。

scoped_ptr:scoped_ptr和auto_ptr的特点完全一样。

socped_array:虽然说socped_ptr不能赋值拷贝,但也有用处,但另一缺点是它不能管理数组,很多情况我们都需要在函数内部动态申请内存,等函数返回时释放内存。
socped_array的特点就在于此,它可以管理连续的地址空间,而在离开作用域时自动释放。需要注意的是socped_array仍然不能用于容器或者函数间传递,因为它仍然没有实现计数引用。

shared_ptr:较之于socped_ptr,shared_ptr的特点在于它可以赋值拷贝,内部有一个引用计数器,只有当计数器等于0时才析构内存,它内部重载了=运算符,所以说shared_ptr可用做容器元素,正如名字一样,shared_ptr——共享。

shared_array:可以这么说,shared_array = socped_arrayr + shared_ptr,怎么说呢。。。就是说shared_ptr既可以用来管理连续地址空间,又可以在函数见传递,或者是用于容器中。

week_ptr:shared_ptr的引用技术很好的解决了复制拷贝问题,但是这些都是01问题,要么能拷贝复制,要么不能拷贝复制,那假如我想在有些情况下需要拷贝复制,有些情况下不需要拷贝复制呢?比如说循环引用,再比如说基类中的指针总不能用计数器吧。所以说这就是week_ptr的用处,week_ptr可以对shared_ptr进行引用而不会引起其计数器增加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: