【C++】动态内存与智能指针
C++常见的内存分配方式有三种:
- 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量;
- 从栈内存分配,这里主要是存储函数内的非static对象;
- 从堆内存动态分配
其中,静态存储区以及栈内存中的对象,都是由编译器自动创建和销毁,而堆内存中的对象都是由程序显示控制的,通常都是new创建delete销毁或者malloc创建free销毁。动态内存的管理非常棘手,如果动态地创建了对象却没有显式得销毁,就会发生内存泄漏;如果在还有指针引用的时候释放了内存就会出现引用非法内存的指针。
C++11提供了两种智能指针用于管理动态对象,他们可以自动的释放所指向的对象,不用再人为显式地手动销毁,他们都定义在memory头文件中:
- shared_ptr,允许多个指针指向同一个对象:
shared_ptr<string> p; //可以指向string的shared_ptr
shared_ptr支持的操作:
void sharedPtrTest(){
//make_shared函数的作用是:
// 在堆中分配一个对象并初始化它,并返回指向该对象的shared_ptr
shared_ptr<int> p1 = make_shared<int>();
shared_ptr<int> p2 = make_shared<int>(); //在条件判断中使用智能指针,相当于检测它是否为空
//如果只能指针没有指向任何内容,返回false,否则返回true
if (p1 && p2){
//解引用智能指针,用法与普通指针一样,获得它指向的对象
cout << *p1 << endl;//output:0 //返回p中保存的指针
cout << p2.get() << endl;//output:002FB464(vs2013) //交换,也可以写作p1.swap(p2)
swap(p1, p2);
cout << *p1 << " " << *p2 << endl; //output: 1 0
} //智能指针的拷贝赋值,递增p1的引用计数,此之后p1被引用2次,p2被引用1次
shared_ptr<int> p3(p1); //返回p1共享智能指针的数量,即p1指向对象被引用次数
cout << p1.use_count() << endl; //output: 2
cout << p2.use_count() << endl; //output: 1 //如果只有自己指向这个对象,返回true,否则false
cout << p1.unique() << endl; //output: 0,说明 p1不是独占对象的
cout << p2.unique() << endl; //output: 1,说明p2独占对象
}
再说说引用计数,每个shared_ptr可以看作有一个关联的计数器,保存着这个指针指向的动态内存内的对象被引用的次数,即有多少个智能指针指向它,当变为0即没有指针指向它时这块内存会被自动释放。而只要还有智能指针指向它,它就不会被释放。
- unique_ptr,该指针会独占指向的对象,不允许其他指针引用,用法基本与shared_ptr相同,但是由于它是独占对象,所以不能进行拷贝赋值以及引用计数相关操作。
void uniquePtrTest(){
unique_ptr<int> p1(new int()); //p1.release()返回指向该内存指针,将p1置为空,表示p1放弃控制权
//此行代码表示p1转移出去对该对象的所有权给p2,即p1置空返回指针赋值给p2
unique_ptr<int> p2(p1.release());
cout << *p2 << endl; //output:42 unique_ptr<int> p3(new int()); //释放p2原指向对象,将p3置空,其指向的对象赋值给p2,reset()也可以没有参数,那么久只释放p2原有对象,不对其赋新值
p2.reset(p3.release());
cout << *p2 << endl; //output:10 }
【C++】动态内存与智能指针的更多相关文章
- 【足迹C++primer】39、动态内存与智能指针(3)
动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...
- 12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用
12.动态内存和智能指针 1.智能指针分为两种shared_ptr和unique_ptr,后者独占所指向的对象.智能指针也是模板,使用时要用尖括号指明指向的类型.类似emplace成员,make_sh ...
- C++相关:动态内存和智能指针
前言 在C++中,动态内存的管理是通过运算符new和delete来完成的.但使用动态内存很容易出现问题,因为确保在正确的时间释放内存是及其困难的.有时候我们会忘记内存的的释放,这种情况下就会产生内存泄 ...
- c++学习笔记—动态内存与智能指针浅析
我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...
- 必须要注意的 C++ 动态内存资源管理(二)——指针对象简单实现
必须要注意的 C++动态内存资源管理(二)——指针对象简单实现 四.拷贝类型的资源 上节我们说过,对于图片类型的资源我们有时候往往采用拷贝(如果对于那种公共图片,可能采用唯一副本,提供 ...
- c++ boost库学习二:内存管理->智能指针
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...
- boost的线程池和内存池 智能指针
内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...
- [C++ Primer] : 第12章: 动态内存
动态内存与只能指针 静态内存用来保存局部static对象, 类static数据成员以及定义在任何函数之外的变量. 栈内存用来保存定义在函数内的非static对象. 分配在静态或栈内存中的对象由编译器自 ...
- 【C++】C++中的动态内存解析
目录结构: contents structure [-] 动态内存和智能指针 使用shared_ptr管理内存 使用new直接管理内存 shared_ptr和new结合使用 unique_ptr we ...
随机推荐
- 【wikioi】1018 单词接龙
题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...
- 【POJ】2299 Ultra-QuickSort(逆序对)
http://poj.org/problem?id=2299 在两个元素相同的数列里,其中一个数列要移动到另一个数列相同元素相同的位置,那么要移动的次数就是这个数列关于另一个数列的逆序对数(hash后 ...
- java中的Integer的toBinaryString()方法
在一次面试的过程中,遇到过这样的题目,题目的大概意思是:让写出Integer类中的toBinaryString()方法 也就是说,把Integer转换为Binary的过程写出来 但是我蒙的,在查了JD ...
- Android环境搭建要点
1.JDK环境变量配置 在环境变量的path变量中加入jdk安装目录的bin路径字符串(C:\Program Files\Java\jdk1.8.0\bin). 配置好后,在命令提示符界面输入&quo ...
- rbegin 和 end 区别
在使用C++的STL时,经常会用到迭代器,那么不得不搞清楚里面的一些指针 begin(), end(), rbegin(), rend()之间的区别与联系,以及它们分别都指向哪个元素.首先要明白的一点 ...
- csv格式
Name,Password nmae:xiaofan,password:1234567890 每个逗号就是一列
- [转]Entity Framework走马观花之把握全局
本文转自:http://blog.csdn.net/bitfan/article/details/12887007 Entity Framework走马观花 之 把握全局 ============== ...
- ORACLE SEQUENCE用法
引用自: http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html 在oracle中sequence就是序号,每次取的时候它会自动增加 ...
- 将组策略中的内容导出至CSV格式
#将组策略首选项中的"本地用户和组"下的所有条目导出 $xml = Get-GPOReport -ReportType Xml -Name "China Desktop ...
- 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, Utf-8
彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, U 1.ASCII: 0-127(128-255未使用),美国标准 2.IS0-8859-1(lati ...