写过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库学习二:内存管理->智能指针的更多相关文章

  1. c++学习笔记—动态内存与智能指针浅析

    我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...

  2. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  3. Obstack是C标准库里面对内存管理的GNU扩展

    Obstack是C标准库里面对内存管理的GNU扩展 Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 ...

  4. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  5. python学习Day9 内存管理

    复习 :文件处理 1. 操作文件的三步骤:-- 打开文件:此时该文件在硬盘的空间被操作系统持有 |  文件对象被应用程序持用 -- 操作文件:读写操作 -- 释放文件:释放操作系统对文件在硬盘间的持有 ...

  6. Android笔记--Bitmap(二)内存管理

    Bitmap(二) 内存管理 1.使用内存缓存保证流畅性 这种使用方式在ListView等这种滚动条的展示方式中使用最为广泛, 使用内存缓存 内存缓存位图可以提供最快的展示.但代价就是占用一定的内存空 ...

  7. UI标签库专题二:JEECG智能开发平台Column(列) 子标签

    UI标签库专题二:JEECG智能开发平台Column(列) 子标签  1.1. Column(列) 子标签 1.1.1. 演示样例 <t:dgCol title="年龄" ...

  8. 12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用

    12.动态内存和智能指针 1.智能指针分为两种shared_ptr和unique_ptr,后者独占所指向的对象.智能指针也是模板,使用时要用尖括号指明指向的类型.类似emplace成员,make_sh ...

  9. RT-Thread学习2 —— 内存管理学习记录

    RT-Thread学习2 -- 内存管理学习记录1 小内存管理算法(mem.c) 1. 小内存管理法: 小内存管理算法是一个简单的内存分配算法.初始时,它是一块大的内存.当需要分配内存块时,将从这个大 ...

随机推荐

  1. 解决ionic 2载入速度慢的问题

    1.ionic build android  --prod 使用生产环境的服务器 (最关键部分) [--production-mode=y,n]  .................  Tell Io ...

  2. 【matlab】绘制双三次插值函数曲线

    想要的效果: 编程时要用到分段函数曲线的绘制方法:..+.*(分段条件). 需要注意的是:函数表达式中的乘除和乘方都要加“.”.因为一般的函数都是数在乘变量运算. x=-:; a=-0.5; w=ab ...

  3. div块级元素获取焦点

    在做弹出层时需要对div获取失去焦点 focus blur只是针对form表单控件的,而对于 span , div , li 之类的,则没办法触发它们的动作 几个事件(摘自w3c). blur事件: ...

  4. SQL2008删除大量数据

    常见问题:工作中数据库难免产生大量的日志,而用户可能关心的只有最近一个月左右的,这些日志占用了服务器磁盘,还可能影响了服务运行效率.甚至在数据库迁移时更因为体积而带来巨大麻烦. 那么,在需要时,删除不 ...

  5. Python使用MySQL数据库的

    然而,2016年开始,我从Python2切换到了Python3,Python2已经基本不再使用,MySQLdb驱动从2014年1月停止了维护.所以,打算重新再来写这篇博客. Python2 ---&g ...

  6. POJ1182食物链(并查集经典好题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/E 题目思路:主要有两种思路:1.带权并查集2.挑战程 ...

  7. 宇视4G设备采用GB/T28181协议成功接入EasyGBS国标流媒体平台的设置流程

    经过了多天的调试对接,终于将宇视的布控球顺利接入到了EasyGBS的国标平台,特地写一下对接过程中遇到的问题,希望能帮助大家避开一些麻烦: 第一步:电脑连接无线网络IPCWIFI,密码12345678 ...

  8. Java 科学计数法

    目录 Java 科学计数法 1 科学计数法的概念 1.1 有效数字 1.2 E记号 2 Java中的科学计数法 2.1 NumberFormat 2.2 DecimalFormat 2.3 BigDe ...

  9. VSpy之C Code Interface的使用

    Spy3 要运行 CCodeInterface 功能,需要安装运行环境,建议安装 Visual Studio2003,2005,2008,2010 或更新的版本.当然也可以安装 VC express ...

  10. window.onload和$(document).ready()比较

    浏览器在页面加载完毕后,JS通常使用window.onload方法为DOM元素添加事件,而jQuery使用的是$(document).ready()方法.两者功能相似,但也有细微差异,下面简要对比一下 ...