写过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. 补装老版本的Java SE

    到oracle注册账号下载bin文件 在bin文件下载目录打开终端复制下面到命令 # chmod +x jdk-6u21-linux-i586.bin 注意版本不同,比如我这次下载到是6u45 chm ...

  2. 椭圆参数方程中的θ(离心角Theta)

    椭圆参数方程中的离心角θ是交以其x轴对应外接圆上点的角度(或是交以其y轴对应内接圆上点的角度) 椭圆的参数程为:x=acosθy=bsinθ.M(x,y)椭圆上一点.过M作直线⊥X轴,交以O为圆心,以 ...

  3. CFindReplaceDialog学习

    The CFindReplaceDialog class allows you to implement standard string Find/Replace dialog boxes in yo ...

  4. 转:SSD详解

    原文:http://blog.csdn.net/a8039974/article/details/77592395, http://blog.csdn.net/jesse_mx/article/det ...

  5. PHP 代码简洁之道 ( PHP Clean Code)

    https://laravel-china.org/topics/7774/the-conciseness-of-the-php-code-php-clean-code

  6. Oracle Delete与系统资源

    在用Delete删除数据时,SQL语句首先要通过全表扫描或索引扫描找到符合条件的记录并删除. 然而在这个过程中将消耗大量的CPU资源,I/O资源以及UNDO数据. 如果删除的数据量较大,将极大的影响系 ...

  7. 哈工大LTP

    http://ltp.ai/ http://pyltp.readthedocs.io/zh_CN/latest/ http://www.cnblogs.com/Denise-hzf/p/6612886 ...

  8. 【BZOJ3029】守卫者的挑战 概率+背包

    [BZOJ3029]守卫者的挑战 Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem, ...

  9. 《从零开始学Swift》学习笔记(Day 13)——数据类型之整型和浮点型

    Swift 2.0学习笔记(Day 13)——数据类型之整型和浮点型 原创文章,欢迎转载.转载请注明:关东升的博客    Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循 ...

  10. Sping Cloud 微服务框架学习

    Spring Cloud官方中文站 https://springcloud.cc