C++ 堆内存
来源:互联网 发布:ps4全境封锁网络卡 编辑:程序博客网 时间:2024/03/29 01:20
我们在使用数组的时候也会面临这种尴尬:数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表达式。
空间申请的太大会造成浪费,空间申请的太小会造成数据溢出而是程序异常。
所以,为了解决这个问题,我们需要能够在程序运行时根据实际情况申请内存空间。
在C++中,允许我们在程序运行时根据自己的需要申请一定的内存空间,我们把它称为堆内存(Heap)空间。
如何获得堆内存空间
我们用操作符new来申请堆内存空间,其语法格式为:new 数据类型[表达式];
其中,表达式可以是一个整型正常量,也可以是一个有确定值的整型正变量,其作用类似声明数组时的元素个数,所以两旁的中括号不可省略。如果我们只申请一个变量的空间,则该表达式可以被省略,即写作:
new 数据类型;
使用new操作符后,会返回一个对应数据类型的指针,该指针指向了空间的首元素。所以,我们在使用new操作符之前需要声明一个对应类型的指针,来接受它的返回值。如下面程序段:
int *iptr;//声明一个指针
int size;//声明整型变量,用于输入申请空间的大小
cin >>size;//输入一个正整数
iptr=new int[size];//申请堆内存空间,接受new的返回值
我们又知道,数组名和指向数组首元素的指针是等价的。所以,对于iptr我们可以认为是一个整型数组。于是,我们实现了在程序运行时,根据实际情况来申请内存空间。
释放内存
当一个程序运行完毕之后,它所使用的数据就不再需要。由于内存是有限的,所以它原来占据的内存空间也应该释放给别的程序使用。对于普通变量和数组,在程序结束运行以后,系统会自动将它们的空间回收。然而对于我们自己分配的堆内存空间,大多数系统都不会将它们回收。如果我们不人为地对它们进行回收,只“借”不“还”,那么系统资源就会枯竭,电脑的运行速度就会越来越慢,直至整个系统崩溃。我们把这种只申请空间不释放空间的情况称为内存泄露。确认申请的堆内存空间不再使用后,我们用delete操作符来释放堆内存空间,其语法格式为:
delete [] 指向堆内存首元素的指针;
如果申请的是一个堆内存变量,则delete后的[]可以省略;如果申请的是一个堆内存数组,则该[]不能省略,否则还是会出现内存泄露。另外,我们也不难发现,delete后的指针就是通过new获得的指针,如果该指针的数据被修改或丢失,也可能造成内存泄露。
其实内存泄漏的原因可以概括为:调用了malloc/new等内存申请的操作,但缺少了对应的free/delete,总之就是,malloc/new比free/delete的数量多。我们在编程时需要注意这点,保证每个malloc都有对应的free,每个new都有对应的deleted!!!平时要养成这样一个好的习惯。
要避免内存泄漏可以总结为以下几点:
- 程序员要养成良好习惯,保证malloc/new和free/delete匹配;
- 检测内存泄漏的关键原理就是,检查malloc/new和free/delete是否匹配,一些工具也就是这个原理。要做到这点,就是利用宏或者钩子,在用户程序与运行库之间加了一层,用于记录内存分配情况。
附:内存泄露检测工具
http://www.oschina.net/translate/valgrind-memcheck
0 0
- C中堆内存和栈内存
- 【C++】堆内存和栈内存详解
- C堆内存分配标准书写格式
- c/c++内存划分 堆和栈
- C/C++ 堆 栈内存分配
- C语言中栈和堆 内存
- C/C++内存管理详解 堆 栈
- C/C++内存管理详解 堆 栈
- C/C++内存管理详解 堆 栈
- C/C++内存管理详解 堆 栈
- C/C++内存管理详解 堆 栈
- C/C++内存管理详解 堆 栈
- C/C++中栈内存和堆内存详解
- 堆内存
- 堆内存
- c/c++内存管理---堆和栈的区别
- C、C++内存区的区别(栈、堆等)
- 【c++】内存栈分配和堆分配图解
- Multipeer Connectivity.Framwork实战
- 有关远程连接时“您的凭据不工作”的解决方法
- Scala中隐式转换(implicit conversion)的优先顺序
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- Extjs mvc 读取XML数据到form
- C++ 堆内存
- appframework3.0(JQmobi)入门教程
- [mysql]创建数据库并指定编码
- OC堆栈
- JS控制 input 输入字符限制
- ArcGIS WebApp Builder使用之自定义Widget
- OC多线程
- java多进程 -CD7-孙鑫-(1)-程序/进程/线程/设置后台线程/将当前线程暂停
- Java中的垃圾回收器