c/c++编译器对程序占用的内存分配可分为以下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
在用C/C++编程时,我们跟堆打交道的多,且要特小心啊。对于堆来说,释放工作由程序员控制,容易产生memory leak。一般使用malloc/calloc -- free;new and delete 来对堆进行操作。一个非常重要的规则就是:开辟的空间一定要在程序结束后把空间释放掉。因为释放避免了内存泄漏,又可以检测到内存申请空间太小或对内存越界错误。
在一次项目中,在init function 中,malloc 了很多空间,然后完成一切相关的操作,且一切正常,结果也正确,但在uninit function中,对空间进行释放时,就出现在以下错误:
DAMAGE: after Normal block (#4826967) at 0x2000E148。
进行相关的debug,问题发现了。
void initialize_input_buffer(
PARAM *in_buffer
)
{
//int i;
in_buffer->voice_flag = 0;
in_buffer->input_len = 128;
in_buffer->num_vad = 0;
if((in_buffer->input = (short *)(calloc((unsigned)128, sizeof(short)))) == NULL)
{
printf("Failed malloc space operate!\n");
}
}
在init中,我申请了128 short空间,但在使用中,由于一些状态没控制好的原因,对这个buffer写了192个short数据,操作过程中,刚好碰到结果正确,但这种情况很危险,这是属于超界操作。在free时,就出现上面那个错误。
在这就写这一些,与些问题相关有一个文章写得更加详细,在此作下链接啊。
http://blog.csdn.net/ablenavy/archive/2008/06/01/2500678.aspx