内存管理
Posted 米罗西
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理相关的知识,希望对你有一定的参考价值。
一. 内存分配方式
- 从静态存储区域分配。内存在程序编译的时候就已经分配好了(即已经编址),这些内存在程序的整个允许期间都存在。例如全局变量,static变量等。
- 在堆栈上分配。在函数执行期间,函数内局部变量(包括形参)的存储单元都创建在堆栈上,函数结束时这些存储单元自动释放(堆栈清退)。堆栈内存分配运算内置于处理器的指令集中,效率很高,并且一般不存在失败的危险,但是分配的内存容量有限,可能出现堆栈溢出。
- 从堆(heap)或自由存储空间上分配,亦称动态内存分配。程序在运行期间用malloc() 或 new 申请任意数量的内存,程序员自己掌握释放内存的恰当时机(使用free() 或 delete).
二. 常见的内存错误及其对策
- 内存分配未成功,却使用了它。解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用 assert(p!=NULL) 进行检查以避免输入非法参数。如果是用malloc() 或 new 来申请内存,应该用 if(p==NULL),if(p!=NULL) 或者捕获异常来进行错误处理。
- 内存分配虽然成功,但是尚未初始化就使用它。创建指针对象或者数组的时候都要赋初值,零值也可,但不可省略。
- 内存越界。多会出现在循环中。
- 忘记了释放内存或者只释放了部分内存,因此造成了内存泄漏。
- 动态内存的申请与释放必须配对,程序中malloc() 与 free() 的使用次数一定要相同,否则肯定有错误(new/delete同理).
- 动态创建数组与删除数组空间的正确方法是
char* p = new char[1025]; delete []p; int* q = new int[1024]; delete []q; //多维数组的动态创建 //一个多维数组在语义上并不等价于一个指向其元素类型的指针,相反它等价于一个“指向数组的指针” char *p1 = new char[5][3]; //ERROR! 语义不等价 int *p2 = new int[4][6]; //ERROR! 语义不等价 char (*p3)[4] = new char[5][4]; //OK,退化第一维,语义等价 int (*p4)[5] = new char[3][5]; //OK,退化第一维,语义等价 char (*p5)[5][7] = new char[20][5][7]; //OK,退化第一维,语义等价 //错误的删除多维数组的方法 delete [][]p3; delete [][]p4; delete [][][]p5; //正确的方法 delete []p3; delete []p4; delete []p5;
- 用free 或 delete 释放了内存后,立即将指针设置为NULL,防止产生“野指针”.
三、指针参数如何传递内存
以上是关于内存管理的主要内容,如果未能解决你的问题,请参考以下文章
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段