写过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. jq中prop和attr的区别以及各自的使用

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...

  2. PID file found but no matching process was found. Stop aborted

    一般脚本部署时不会遇到这种情况,有时候自个手动处理会出现”PID file found but no matching process was found. Stop aborted”,根据意思就可以 ...

  3. 对 pthread 做的一个简陋封装

    参考自 pthreadcc 库的 ThreadBase 类 用法:继承该类,重写 execute 方法,调用父类的 launchThread 方法启动线程 Thread.h // // Thread. ...

  4. 关于angularjs中的ng-class的使用

    在angularjs中,包子认为ng-class的用法是相当的大,这个相当于jquery的addClass和removeClass.在这个地方,废话不多说,直接上一小段代码 当kefu这个变量为真的时 ...

  5. Magic Cast Method in Java Magic Trick In Java

    https://www.atlassian.com/blog/archives/magic_trick_in_java https://www.gamlor.info/wordpress/2010/1 ...

  6. 扩展类 HOW TO EXTEND CLASSES TO MAKE NEW CLASSES IN PYTHON

    How to Extend Classes to Make New Classes in Python - dummies https://www.dummies.com/programming/py ...

  7. 数据链路层负载均衡 Linux Virtual Server

    w 李智慧

  8. 如何理解Comparator接口中的升降序?

    import java.util.*; class DescType implements Comparator { public int compare(Object o1, Object o2) ...

  9. jq cookie

    //$.cookie("xx");//读取xx的值 //$.cookie("xx","123");//设置xx的值为123 //$.cook ...

  10. 使用nose_parameterized使unitTest实现参数化

    nose-parameterized是一个针对Python单元测试框架实现参数化的扩展 import unittest # from nose_parameterized import paramet ...