智能指针是一种具备指针类似行为的对象,当不在需要它的时候自动删除其引用的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. What is Web Application Architecture? How It Works, Trends, Best Practices and More

    At Stackify, we understand the amount of effort that goes into creating great applications. That’s w ...

  2. nginx配置事例

    #user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  3. 分析并实现 360 P1路由器上的测速功能(也可以针对金山测速功能)

    现在各种智能路由器以及一些PC上的防火墙软件,都提供网络测速功能.笔者对此进行了研究,并在自己的路由器上也实现了此功能.下面做一下总结 一般的网络测速,主要关注两个方面:网络延迟和下载速率 1.网络延 ...

  4. lua语言介绍

    什么是Lua Lua是一个小巧的脚本语言. 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  5. ES6快速入门使用

    https://www.jianshu.com/p/061304806bda Babel-webpack的配置 Bebal官方文档 前段项目我想使用ES6的语法我应该怎么做呢?我们可以查看Babel的 ...

  6. [Bayes] *Bayesian Deep Learning for Transparency Improvement

    为何有必要进修统计机器学习? 因为你没有那么多的数据 因为未知的东西最终还是需理论所解释 基于规则?基于概率? ---- 图灵奖得主.贝叶斯之父 Judea Pearl 谈深度学习局限,想造自由意志机 ...

  7. Vector、ArrayList、List使用深入剖析

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  8. 【BZOJ】1656:[Usaco2006 Jan]The Grove 树木(bfs+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1656 神bfs! 我们知道,我们要绕这个联通的树林一圈. 那么,我们想,怎么才能让我们的bfs绕一个 ...

  9. uva 465 - Overflow 高精度还是浮点数?

    uva 465 - Overflow  Overflow  Write a program that reads an expression consisting of two non-negativ ...

  10. 【微信小游戏】文件系统,远程加载资源打破4M限制

    一.前提 微信小游戏,对游戏包体的大小有严格是限制,上传文件大小<4M,但是本地缓存文件有50M空间,也就是说我们可以将一些资源放到网上,然后缓存到本地. 二.官方概念 文件系统 文件系统是小程 ...