« RSA SecurID 双因素认证(Two-Factor Authentication) (导言) | Main | 用 php 写 script 管理脚本 »
December 24, 2005
从内存泄漏(Memory Leak)提到内存管理
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。 https://windtear.net/archives/2005/12/24/000864.html http://windtear.net/archives/2005/12/24/000864.html 从内存泄漏(Memory Leak)提到内存管理 昨天下午忙着追一个内存泄漏问题 今天就blog写写内存的事 林锐在《高质量C++/C编程指南》第七章详细总结了内存管理这一块 内存分配: 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好, 这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建, 函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中, 效率很高,但是分配的内存容量有限。 (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存, 程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定, 使用非常灵活,但问题也最多。 指针与数组的对比: 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。 数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。 指针远比数组灵活,但也更危险。 栈内存在函数结束时自动消亡 函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。 函数free的原型如下: void free( void * memblock ); 如果p是NULL指针,那么free对p无论操作多少次都不会出问题。 如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。 【规则7-2-4】动态内存的申请与释放必须配对,防止内存泄漏。 |
Posted by windtear at December 24, 2005 5:28 PM