内存管理

Posted 米罗西

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理相关的知识,希望对你有一定的参考价值。

一. 内存分配方式

  1. 从静态存储区域分配。内存在程序编译的时候就已经分配好了(即已经编址),这些内存在程序的整个允许期间都存在。例如全局变量,static变量等。
  2. 在堆栈上分配。在函数执行期间,函数内局部变量(包括形参)的存储单元都创建在堆栈上,函数结束时这些存储单元自动释放(堆栈清退)。堆栈内存分配运算内置于处理器的指令集中,效率很高,并且一般不存在失败的危险,但是分配的内存容量有限,可能出现堆栈溢出。
  3. 从堆(heap)或自由存储空间上分配,亦称动态内存分配。程序在运行期间用malloc() 或 new 申请任意数量的内存,程序员自己掌握释放内存的恰当时机(使用free() 或 delete).

二. 常见的内存错误及其对策

  1. 内存分配未成功,却使用了它。解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用 assert(p!=NULL) 进行检查以避免输入非法参数。如果是用malloc() 或 new 来申请内存,应该用 if(p==NULL),if(p!=NULL) 或者捕获异常来进行错误处理。
  2. 内存分配虽然成功,但是尚未初始化就使用它。创建指针对象或者数组的时候都要赋初值,零值也可,但不可省略。
  3. 内存越界。多会出现在循环中。
  4. 忘记了释放内存或者只释放了部分内存,因此造成了内存泄漏。
  • 动态内存的申请与释放必须配对,程序中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,防止产生“野指针”.

三、指针参数如何传递内存

  

 

以上是关于内存管理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Git 来管理 Xcode 中的代码片段

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

massCode 一款优秀的开源代码片段管理器

如何管理在每个 git 版本中添加私有代码片段?

如何使用Android片段管理器传递变量[重复]

Android:使用支持片段管理器时复制片段