c - 内存泄漏 - C

标签 c memory-leaks

在同一个文件中我有两个例程。第一个将存储来自一个文件的一些字节。另一个会将此信息提供给将处理该信息的例程。

boolean
adin_memory(char* buffer, int size_chunck, int end_flag){
    real_data=(SP16 *)malloc(size_chunck); //real_data -->global
    memcpy(&(real_data[0]),&(buffer[0]),size_chunck);

    pos_write += size_chunck;
    global_size = size_chunck;
    global_end_flag = end_flag;
    //end_flag = 1 --> end of Stream
    //end_flag = 0 --> Streaming
    return TRUE;
}

为了防止泄漏的可能性,我使用了 malloc。但是这个例程被调用了几次。所以,在 adin_memoryadin_read 的一些重复之后(free),我认为内存开始碎片化(我可以看到泄漏与任务管理器中输入文件的大小 - RAM 的增量)。是对的吗?我怎样才能防止这种情况发生?为了查看此泄漏,我在 adin_memory 的开头和结尾放置了一个断点,查看任务管理器。

int
adin_read(SP16 *buf, int sampnum)
{
  FILE *fp;
  int cnt = 0;
  fp = gfp;

  //(.......)
    if(global_end_flag == 1 || pos_write == pos_read){ return -1;}

    for(i = pos_read/sizeof(SP16); i <= sampnum; i++){
         if(i >= pos_write/sizeof(SP16)) {              
             cnt = i;
             //(....)
             break;
         }
         buf[i] = real_data[i];
     }
     pos_write = 0; 
     //(....)
     free(real_data);
     return cnt;
}

最佳答案

int
adin_read(SP16 *buf, int sampnum)
{
  FILE *fp;
  int cnt = 0;
  fp = gfp;

  //(.......)
    if(global_end_flag == 1 || pos_write == pos_read){
       /* Leak is possibly here. You return without freeing.
          Ensure free is called here also. And it is good practice to
          make the freed pointer point to NULL so you can check and
          avoid double free problems. */       
       return -1;
    }

    for(i = pos_read/sizeof(SP16); i <= sampnum; i++){
         if(i >= pos_write/sizeof(SP16)) {              
             cnt = i;
             //(....)
             break;
         }
         buf[i] = real_data[i];
     }
     pos_write = 0; 
     //(....)
     free(real_data);
     return cnt;
}

关于c - 内存泄漏 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33374924/

相关文章:

我可以在结构中使用 "int"作为我的动态数组吗?

c++ - 检测引用计数智能指针内存泄漏的设计模式

ios - Swift 结构中的内存泄漏 - 如何解决这个问题?

c - 了解 EOF

android - TextToSpeech 和内存泄漏

javascript - 避免内存泄漏 winjs EventListeners

c - libmagic 内存泄漏?

c - 如何防止使用 arm-none-eabi-gcc 编译器对该函数进行 vector 运算优化?

c - 将 2 个数组的和存储到一个简单的 int 变量中

c - 如果一个指针被释放,它指向的内容又如何呢?会不会受影响?