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. 小内存管理法: 小内存管理算法是一个简单的内存分配算法.初始时,它是一块大的内存.当需要分配内存块时,将从这个大 ...
随机推荐
- window linux IPC ftok BY_HANDLE_FILE_INFORMATION
看这题目就很乱,心情当然也是不怎么美好了.前一段时间做了一个项目,AIX(Unix的一种)中的一个系统向WINDOWS移植,开发环境由IBM的C/C++(叫什么忘记了,好像是xlC)变为VC++. 这 ...
- java中==和equals区别
主要是使用String时候的区别! 一.java当中的数据类型和“==”的含义 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,bool ...
- UTI 唯一类型标识
本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6657231 applicationdocumentationtypessys ...
- X明X源面试题《三》
本文转自自zhangxh_Doris 昨天(05.23)下午去参加了明源软件的暑期实习宣讲+笔试,第一次听说这个行业,行业和笔试风格完全不一样啊,5道行测智力题+1个问答+ 斐波那契数列 + 洗牌算法 ...
- node.js中的路由(url)初步
1.建立n4_root.js var http = require('http'); var url = require('url'); //这是node.js中自带的var router = req ...
- K-th Number(主席树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 59327 Accepted: 20660 Ca ...
- MySQL中常用字符串函数
1.字符串长度函数CHAR_LENGTH(str),LENGTH(str) CHAR_LENGTH()返回值为字符串str的长度,长度的单位为字符.一个多字节字符算作一个单字符.对于一个包含五个二字 ...
- JQuery处理DOM元素
现有一个id为txtMyTest的元素 获取属性值 $('#id').attr('属性名'); 设置属性值 $('#id').attr('属性名','需要设置的值'); 设置多个属性 如下同时设置va ...
- 保存到properties
@FXMLprivate void savaconfig(ActionEvent event) { try { Properties prop = new Properties(); FileWrit ...
- 启动 nodemanger 报错javax.security.sasl.SaslException: GSS initiate failed
最近启动 Hadoop, nodemanger 老挂,报kerberos 验证错误,各种查找原因,时间也同步,kint 也能登录到kerberos,一直找不到原因,最后发现是网关和远端的时间同步,但是 ...