刘品
学以致用---博主简介:专注语音、视频数字信号处理方面的研究以及算法在手机平台上面的移植和优化。涉及语音/音频编解码,语音增强,语音识别,语音音质客观评估,VOIP语音引擎 Qos算法模块和声音变速不变调和变调不变速等功能实现。熟悉ARM 各个系列的CPU,用ARMv4,ARMv5,ARMv6 and Cortex Neon 汇编优化相关算法代码,争取perforamance 最优。目前主要Windows mobile and Android platform上做相关speech/audio算法以及应用开发, HEVC 编解码器PC 和手机上的开发与应用。(交流Email:liupin.2008@gmail.com)

      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

 

posted on 2008-08-03 16:20  liupin  阅读(668)  评论(0编辑  收藏  举报

-->