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,否则会造 ...
随机推荐
- win 7和虚拟机之间ping
虚拟机的网卡和真实机的IP设为同一网段.用ping检查是否通,通了后用工具连接ssh看能否登录!如果成功的话winscp应该就能用了.如果不同就要就检查防火墙看是否开放了22端口,没有的话就要开放一下 ...
- 原生javascript 实现的文本编辑器
直接来干活上代码.就一个函数execCommand():自己百度一下. 在线预览 <!doctype html> <html> <head> <title&g ...
- gitlab手残点错关闭注册No authentication methods configured on login page
Gitlab - 如何解決 "No authentication methods configured on login page" ? (gitlab version : 8.1 ...
- expr判断整数是相加的值,返回命令的返回值$? 是0,但是少数情况是1,例如1 + -1 ,$? 的结果是1 ,判断要大于1最准确
[root@m01 ~]# expr 1 + 12[root@m01 ~]# echo $?0[root@m01 ~]# echo 1 - 51 - 5[root@m01 ~]# expr 1 - 5 ...
- Colored Sticks - poj2513(trie + 并查集)
问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次.这样就是求图中是否存在欧拉路Euler-Path.由图论知识可以知道,无向图存在欧拉路的充要条件为:① 图是连通的:② ...
- Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目
作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...
- 你是怎么理解java的泛型的?
解答: 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知 ...
- 卡友友刷MPOS注册开通流程!
1.下载友刷APP:打开微信扫描机器背面二维码—点击右上角游览器打开 2. 注册-身份证认证-结算卡绑定:用本人手机号注册完成后,顺着进行身份认证.以及储蓄结算卡绑定.具体看下图: 3.绑定机器:选择 ...
- Ubuntu14.4下搭配WEB服务器(apache + php + mysql)
今天,趁着自己动手安装web服务器的余热,将Ubuntu14.4搭配WEB服务器的过程记录下来. “一切皆文件”. 说明:网上关于类似搭配web服务器的教程,案例不计其数,但自己亲自动手“试试”,一定 ...
- DefaultActionInvocation类的执行action
DefaultActionInvocation类的执行action 上一章里面有提到过DefaultActionInvocation类的invoke方法里面的invokeActionOnly方法.没有 ...