linux c 内存管理

动态内存管理是编写高效率程序的基础,如果不能合理的利用,会对整个程序产生致命的危害,所以在程序设计时,必须清楚内存分配的方式。
内存分配方式通常有以下几种:
1 从静态存储区域分配:
这种分配方式是程序编译时就已经分配好了,这块内存在程序的整个运行期间都存在,常用于 全局变量 static 变量
2 在栈上创建
函数执行时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。
3 在堆上分配
堆上分配方式也称为动态内存分配。程序在运行的时候需使用malloc 来申请内存的大小,使用完毕后,需使用free来释放内存


内存错误常见情况:
1 内存分配未成功 却使用内存。
所以内存在使用前 ,一定要使用 内存分配指针是否为NULL 。
如果指针p是函数的参数,那么在函数的入口处需要使用assert(p!=NULL) 来检测
如果是采用malloc 申请的内存空间,则需要使用 if(p !=NULL) 来检测内存是否申请成功
进行异常检测和处理
2 内存分配成功,但是未进行初始化就进行使用
通常犯这种错误是由于:
1 忘记进行初始化
2 误以为内存未初始化的缺省值为0
3 内存分配成功,也进行了初始化,但操作越过了内存边界
这种常见的错误为,我们分配10个字节,却使用11个字节,此时就会发生内存越界错误。所以使用地址一定不能大于申请的地址数。
4 忘记释放内存,导致内存泄漏
这种错误是最常见通常是由于使用malloc申请内存后,未进行释放。
导致每次调用一次函数,就丢失一次内存,程序长期运行,待内存耗尽时,程序会突然死掉。
通常情况下,内存泄漏指堆内存泄漏。堆内存是指程序从堆中分配的,大小任意的内存,使用完后,需要显式的释放内存。


内存管理中常用策略:
在Linux中我们可以通过ps命令查看程序的运行状态,来观测程序到内存使用情况,及内存是否一直在增加.

相关阅读:
堆栈的区别及何时用堆 何时用栈
malloc free函数
为什么要使用动态存储器分配(malloc)?
malloc的使用方法及注意事项