c++ boost库学习二:内存管理->智能指针
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏。如下所示:
int _tmain(int argc, _TCHAR* argv[])
{
char *p = new char[];
try{
strcpy(p,"hello");
}
catch(int &e)
{
//....
return ;
}
delete p;
return ;
}
如果程序发生error而异常退出不会执行到最后的delete p,从而导致内存泄漏。于是程序员必须在所有分支都加上delete语句释放内存,这样太麻烦而且容易出错。
所以智能指针的出现很好的解决了这个问题。c++98标准里有一个std::auto_ptr,但下面介绍的是另外的智能指针scoped_ptr(我反正就当它跟auto_ptr是一样的)以及比较推荐使用的shared_ptr。
scoped_ptr
#include "iostream"
#include <string>
#include <boost\smart_ptr.hpp>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
boost::scoped_ptr<string> p(new string("hello"));
cout<<*p<<endl; //hello
cout<<p->size()<<endl; // boost::scoped_ptr<string> p2 =p; //error
p++; //error return ;
}
scoped_ptr只有*和->操作符,它退出作用域之后会自动释放内存,所以不需要delete。
scoped_ptr不允许拷贝和赋值。与普通指针相比它只有很少的接口,所以它更安全。
通过 T* get() const; 函数可以返回普通指针,比如上面代码可以通过 string *s=p.get(); 返回string*
scoped_array
从名字就可以看出来scoped_array就是一个scoped_ptr的数组。如果说scoped_ptr可以看作是自动执行new/delete操作的话,那scoped_array可以看作是自动执行
new[]/delete[]操作。但由于scoped_array功能有限以及不安全,所以不推荐使用
#include "iostream"
#include <string>
#include <boost\smart_ptr.hpp>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
boost::scoped_array<int> sa(new int[]);
for(int i=;i<;i++)
sa[i]=i;
cout<<sa[]<<endl;
return ;
}
shared_ptr
shared_ptr是最好的,最推荐使用的,原因如下:
shared_ptr 除了*和->以外还支持比较运算 ==,<
shared_ptr是基于引用计数型的智能指针,可以被赋值和拷贝
shared_ptr能被安全的放在标准容器中
#include "iostream"
#include <vector>
#include <string>
#include <map>
#include <boost\smart_ptr.hpp>
using namespace std; typedef boost::shared_ptr<string> sp_ptr;
int _tmain(int argc, _TCHAR* argv[])
{
sp_ptr sp(new string("hello"));
sp_ptr sp2=sp;
assert(sp==sp2); // 在标准容器中使用
vector<sp_ptr> v;
v.push_back(sp);
v.push_back(sp2);
cout<<v.size()<<endl; //
map<sp_ptr,int> m;
sp_ptr sp3(new string("hello"));
m[sp3] = ;
return ;
}
有shared_ptr 同样也会有shared_array。基本跟scoped_ptr和scoped_array类似,这里不做详细介绍。
c++ boost库学习二:内存管理->智能指针的更多相关文章
- c++学习笔记—动态内存与智能指针浅析
我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- Obstack是C标准库里面对内存管理的GNU扩展
Obstack是C标准库里面对内存管理的GNU扩展 Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- python学习Day9 内存管理
复习 :文件处理 1. 操作文件的三步骤:-- 打开文件:此时该文件在硬盘的空间被操作系统持有 | 文件对象被应用程序持用 -- 操作文件:读写操作 -- 释放文件:释放操作系统对文件在硬盘间的持有 ...
- Android笔记--Bitmap(二)内存管理
Bitmap(二) 内存管理 1.使用内存缓存保证流畅性 这种使用方式在ListView等这种滚动条的展示方式中使用最为广泛, 使用内存缓存 内存缓存位图可以提供最快的展示.但代价就是占用一定的内存空 ...
- UI标签库专题二:JEECG智能开发平台Column(列) 子标签
UI标签库专题二:JEECG智能开发平台Column(列) 子标签 1.1. Column(列) 子标签 1.1.1. 演示样例 <t:dgCol title="年龄" ...
- 12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用
12.动态内存和智能指针 1.智能指针分为两种shared_ptr和unique_ptr,后者独占所指向的对象.智能指针也是模板,使用时要用尖括号指明指向的类型.类似emplace成员,make_sh ...
- RT-Thread学习2 —— 内存管理学习记录
RT-Thread学习2 -- 内存管理学习记录1 小内存管理算法(mem.c) 1. 小内存管理法: 小内存管理算法是一个简单的内存分配算法.初始时,它是一块大的内存.当需要分配内存块时,将从这个大 ...
随机推荐
- Unity3D学习笔记——NGUI之UISlider
UISlider:用于创建简单的滑动块和进度条,并且可以添加一个拇指按钮. 效果图如下: 一:使用步骤 1.从上面的效果看出,这个工具由四部分组成:背景图,进度图,进度lable显示,拇指按钮. 2. ...
- Laravel 5.1 Blade模板引擎
为什么要使用blade 它是干什么用的? blade模板引擎使我们写HTML页面的地方,使用它是因为它能给我们提供很多的遍历,减少代码的重复率 提高开发效率.我们写blade的路径是 resource ...
- Linux重启与关机命令
重启命令 reboot shutdown -r now 立即重启 shutdown -r 10 十分钟后重启 shutdown -r 17:00 在17:00重启 关机命令 halt 立即关机 p ...
- Scanner类与Random类
1.Scanner类 Scanner类的作用是获得输入,下面代码用于获得用户的键盘输入,实例如下: 常用方法: String next():将输入信息的下一个标记扫描为一个字符串 Int nextIn ...
- adb连接夜神模拟器
1.打开夜神模拟器,打开设置,调成手机模式,初次进入的话,进入设置,点击版本号5次,可以激活使用开发者模式,进入后打开USB调试功能 2.打开文件资源管理器,进入夜神模拟器的安装位置,在地址栏输入cm ...
- Selenium IDE的使用
Selenium IDE 的作用 Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作. 在实际自动化测试中,不会用Selenium ...
- 【python】-- Django 中间件、缓存、信号
Django 中间件.缓存.信号 一. Django 中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...
- CentOS 7.4 防火墙&网卡设置
防火墙 查看防火墙状态 临时关闭防火墙 (关闭的是当前正在运行的防火墙,重启时还是会自启) 彻底关闭防火墙 (开机不会再自启) 开启防火墙 查看防火墙状态 网卡 查看网卡状态
- python模块学习(一)
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- Android系统移植与调试之------->build.prop生成过程分析
本文简要分析一下build.prop是如何生成的.Android的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言/编译时间, etc.),编 ...