zoukankan      html  css  js  c++  java
  • boost智能指针总结

    智能指针是一种具备指针类似行为的对象,当不在需要它的时候自动删除其引用的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(1));   
      v.push_back(new int(2));   
    }  

    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、

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

    2、

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

    五、解答

    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

  • 相关阅读:
    【转载】通用 application 彻底退出应用 获崩溃异常,保存错误日志,并重启应用
    【转载】 Android App 内存泄露之Thread
    【转载】ViewHolder的简洁写法
    Android知识整理(5) apk反编译与代码混淆
    CAS单点登录客户端配置
    一位知乎网友的人生感悟
    Android知识整理(4) 关于Android应用的退出
    Android知识整理(3) 两种自定义样式的Checkbox
    Android知识整理(2)【转】android中三种onClick事件的实现方式与对比
    Android知识整理(1) Pull解析器解析XML
  • 原文地址:https://www.cnblogs.com/youxin/p/4303282.html
Copyright © 2011-2022 走看看