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());
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、
- #include <iostream>
- #include <cstring>
- char *get(const char *s)
- {
- int size = std::strlen(s);
- char *text = new char[size + 1];
- std::strncpy(text, s, size + 1);
- return text;
- }
- void print(char *text)
- {
- std::cout << text << std::endl;
- }
- int main(int argc, char *argv[])
- {
- if (argc < 2)
- {
- std::cerr << argv[0] << " <data>" << std::endl;
- return 1;
- }
- char *text = get(argv[1]);
- print(text);
- delete[] text;
- }
2、
- #include <vector>
- template <typename T>
- T *create()
- {
- return new T;
- }
- int main()
- {
- std::vector<int*> v;
- v.push_back(create<int>());
- }
五、解答
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智能指针总结的更多相关文章
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- Boost智能指针-基础知识
简单介绍 内存管理一直是 C++ 一个比較繁琐的问题,而智能指针却能够非常好的解决问题,在初始化时就已经预定了删除.排解了后顾之忧.1998年修订的第一版C++标准仅仅提供了一种智能指针:std::a ...
- [转] Boost智能指针——scoped_ptr
http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...
- boost 智能指针intrusive_ptr
boost::intrusive_ptr一种“侵入式”的引用计数指针,它实际并不提供引用计数功能,而是要求被存储的对象自己实现引用计数功能,并提供intrusive_ptr_add_ref和intru ...
- Boost智能指针使用总结
内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 智能指针定义 ...
- Boost智能指针——weak_ptr
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include <string>#include <iost ...
- Boost智能指针——scoped_ptr
boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...
- 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
随机推荐
- JVM Specification 9th Edition (3) Chapter 2. The Structure of the Java Virtual Machine
Chapter 2. The Structure of the Java Virtual Machine 内容列表 2.1. The class File Format (class文件的格式) 2. ...
- tomcat修改默认端口
1.webserver: tomcat2.version: Apache Tomcat/7.0.293.operation: 修改默认端口 3.1 修改tomcat目录下的/conf/server ...
- 经典Mathematica函数大全
转自:http://blog.renren.com/share/238323208/8426343822 Mathmatic 函数表 一.运算符及特殊符号 Line1; 执行Line,不显示结果 ...
- 第二百三十九节,Bootstrap路径分页标签和徽章组件
Bootstrap路径分页标签和徽章组件 学习要点: 1.路径组件 2.分页组件 3.标签组件 4.徽章组件 本节课我们主要学习一下 Bootstrap 的四个组件功能:路径组件.分页组件.标签组件 ...
- 【转】VC++的Unicode编程
转自http://www.cnblogs.com/kex1n/archive/2010/03/15/2286510.html 原始出处http://www.vckbase.com/document/v ...
- Dynamics CRM 系统自己定义部分的语言翻译
Dynamics CRM 自带语言切换功能,在官网下载所需语言包安装后,在设置语言中就能看到你所加入的语言.勾选要启用的语言应用就可以.再打开系统设置--语言就能看到可更改用户界面语言的显示了. wa ...
- reactjs中props和state最佳实践
http://blog.csdn.net/dangnian/article/details/50998981
- SQL语法:查询此表有另外一个表没有的数据
select bei.ExamItem_Code2,*from PeisPatientExamItem ppeijoin PeisPatientFeeItem ppfion ppfi.ID_Patie ...
- 移动端web页面上滑加载更多功能
背景介绍: 开发企业微信的一个应用,实现在企业微信中调用自己程序页面,页面加载多模块数据,向下滑加载更多,等等等等,一波三折 然后很早就成功了是这样实现的: html: <div id=&quo ...
- 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP
[BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...