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

 

相关文章:

  • 2021-12-10
  • 2022-01-03
  • 2022-12-23
  • 2021-12-05
  • 2021-12-06
  • 2021-11-21
猜你喜欢
  • 2021-12-06
  • 2021-12-31
相关资源
相似解决方案