智能指针是一种具备指针类似行为的对象,当不在需要它的时候自动删除其引用的c++对象。直接点说就是自动析构C++对象。

boost提供了6种智能指针,如下所示:

scoped_ptr <boost/scoped_ptr.hpp> 单个对象的简单的唯一所有权. 不能拷贝.
scoped_array <boost/scoped_array.hpp> 数组对象的唯一所有权. 不能拷贝.
shared_ptr <boost/shared_ptr.hpp> 多个指针间共享对象所有权.
shared_array <boost/shared_array.hpp> 多个指针间共享数组所有权
weak_ptr <boost/weak_ptr.hpp>

访问被shared_ptr所有的对象,但并不拥有这个对象。通常与shared_prt

联合使用来避免环形引用

intrusive_ptr <boost/intrusive_ptr.hpp>

共享有着嵌入了引用计数对象的所有权。它在性能上比shared_ptr更好,

但需要对象类型实现自己的引用计数机制

intrusive:侵入的,打扰的。

http://blog.csdn.net/saga1979/article/details/7100273

http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html

ptr_vector 指针容器

在用C语言时,如果我们要创建一个动态数组,我们可以new一个,但是这样使用十分麻烦,因此可以选择更高级写的容器vector,它可以很好的动态管理数组(push_back、erase等)。对应的,boost中也有这样的指针:

#include <boost/ptr_container/ptr_vector.hpp>   

int main()
{
boost::ptr_vector<int> v;
v.push_back(new int());
v.push_back(new int());
}

boost::ptr_vector专门用于动态分配的对象,它使用起来更容易也更高效。 boost::ptr_vector 独占它所包含的对象,因而容器之外的共享指针不能共享所有权,这跟 std::vector<boost::shared_ptr<int> > 相反。

除了boost::ptr_vector之外,专门用于管理动态分配对象的容器还包括:boost::ptr_deque, boost::ptr_list,boost::ptr_set,boost::ptr_map,boost::ptr_unordered_set和 boost::ptr_unordered_map。这些容器等价于C++标准里提供的那些。最后两个容器对应于std::unordered_set和std::unordered_map,它们作为技术报告1的一部分加入C++标准。如果所使用的C++标准实现不支持技术报告1的话,还可以使用Boost C++库里实现的 boost::unordered_set和boost::unordered_map。

四、练习题:

优化下面两个程序:

1、

  1. #include <iostream>
  2. #include <cstring>
  3. char *get(const char *s)
  4. {
  5. int size = std::strlen(s);
  6. char *text = new char[size + 1];
  7. std::strncpy(text, s, size + 1);
  8. return text;
  9. }
  10. void print(char *text)
  11. {
  12. std::cout << text << std::endl;
  13. }
  14. int main(int argc, char *argv[])
  15. {
  16. if (argc < 2)
  17. {
  18. std::cerr << argv[0] << " <data>" << std::endl;
  19. return 1;
  20. }
  21. char *text = get(argv[1]);
  22. print(text);
  23. delete[] text;
  24. }

2、

  1. #include <vector>
  2. template <typename T>
  3. T *create()
  4. {
  5. return new T;
  6. }
  7. int main()
  8. {
  9. std::vector<int*> v;
  10. v.push_back(create<int>());
  11. }

五、解答

1、要优化这个程序,用作用域数组指针就可以了,它会自动调用delete[]析构

#include <boost/scoped_array.hpp>

char *get(const char *s)

{

int size = std::strlen(s);

boost::scoped_array<char> s(new char[size]);

std::strncpy(text, s, size + 1);

return text;

}

main函数里的delete可以不要了,进而避免程序在delete调用之前退出导致的内存未释放。

2、要优化它,当然是使用ptr_vector指针了,代码同上面的例子。

http://www.codeproject.com/Articles/7351/ptr_vector-A-Container-For-Pointers

boost智能指针总结的更多相关文章

  1. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  2. Boost智能指针-基础知识

    简单介绍 内存管理一直是 C++ 一个比較繁琐的问题,而智能指针却能够非常好的解决问题,在初始化时就已经预定了删除.排解了后顾之忧.1998年修订的第一版C++标准仅仅提供了一种智能指针:std::a ...

  3. [转] Boost智能指针——scoped_ptr

    http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...

  4. boost 智能指针intrusive_ptr

    boost::intrusive_ptr一种“侵入式”的引用计数指针,它实际并不提供引用计数功能,而是要求被存储的对象自己实现引用计数功能,并提供intrusive_ptr_add_ref和intru ...

  5. Boost智能指针使用总结

    内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 智能指针定义 ...

  6. Boost智能指针——weak_ptr

    循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string>#include <iost ...

  7. Boost智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...

  8. 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  9. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

随机推荐

  1. eclipse不自动弹出提示的解决办法(eclipse alt+/快捷键失效)centos 6.7

    1.次方法用于没有一点提示的情况:依次打开eclipse上面的windows ——preferences ——java ——editor —— content assist ,在右上方有一行“sele ...

  2. debian下为arm开发板创建基于debian或emdebian的根文件系统

    Debian系统本身包含对arm的支持,其包含的软件包最多,但是最终的文件系统要大一些. emdebian 是一个非常好用的嵌入式linux操作系统,其基于debian的特点对于熟悉debian系统的 ...

  3. wget命令 -c断点续传

    wget -O   wordpress.zip http://www.linuxde.net/download.aspx?id=1080 下载文件在指定位置并进行重命名 -O file       - ...

  4. 用node.js进行微信公众平台的开发

    基本原理 用nodejs怎样来实现对微信公众平台的开发呢? 别的就不多说了,先来简单介绍微信公众平台的基本原理. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务 ...

  5. windows下GVIM的配置(vimrc)

    学习python时想要在gvim中配置python的编译环境,网上找到一个比较好用的vimrc配置,保存下来以备下次有需要. set encoding=utf-8 set termencoding=u ...

  6. win10执行shell脚本

    我们在win10如何执行以.sh文件的脚本呢? 开发步骤:1.写脚本b2q_goods.sh #!/bin/bashsql="select * from b2q.goods where go ...

  7. 使用Array的原型使对象具有length,和数组的内容

    var elems = { length: , add: function (elem) { Array.prototype.push.call(this, elem); }, gather: fun ...

  8. 【Python】setup-转载

    python+PyQT+Eric安装配置 python+PyQT+Eric安装配置 作者: loker 博客: http://www.cnblogs.com/lhj588/ 时间: 2011年10月3 ...

  9. 视觉slam闭环检测之-DBoW2 -视觉词袋构建

    需要准备的知识点:http://www.cnblogs.com/zjiaxing/p/5616653.html      http://www.cnblogs.com/zjiaxing/p/56166 ...

  10. AWS系列-磁盘扩容

    1 磁盘扩容 1.1 卷介绍 aws磁盘扩容有两个方式 1.购买新的磁盘,挂载到相应的目录 2.原来磁盘做快照,购买新的磁盘,选择恢复快照到硬盘上,这样相当于,从一块硬盘上50G升级到100G 说到a ...