内存释放的重要性

      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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值