C内存泄漏尽管免费

前端之家收集整理的这篇文章主要介绍了C内存泄漏尽管免费前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在使用Valgrind调试我的程序时,尽管我认为有效的电话是免费的,但我发现内存泄漏.首先,分配内存并存储的代码
  1. row = malloc(sizeof(Row));
  2. row->columns = malloc(sizeof(char*) * headcnt);
  3. row->numcol = 0;
  4.  
  5. ...
  6.  
  7. row->numcol = colcnt;
  8. rows = realloc(rows,(rowcnt+1) * sizeof(Row));
  9. rows[rowcnt++] = *row;

负责尝试释放内存的代码

  1. void cleanUp(){
  2. int i = 0;
  3. int j = 0;
  4.  
  5. for (i = 0; i < rowcnt; i++){
  6. for (j = 0; j < rows[i].numcols; j++){
  7. free(rows[i].columns[j]);
  8. }
  9. free(&rows[i]);
  10. }
  11. free(rows);
  12. exit(0);
  13. }

行声明

  1. typedef struct {
  2. char** columns;
  3. unsigned short int numcol;
  4. } Row;
  5.  
  6. Row* rows = NULL;

更糟糕的是,这个程序有时会引起glibc错误,并且自由(& rows [i])抱怨双重空格.我对C很新,并且会感谢任何人可能拥有的任何指针(ahem).

解决方法

做行[rowcnt] = * row;有效地复制您分配的内存.您的数组行应该是一个指针数组.也像Oli Chalesworth指出,你自由的列应该是一个免费的所有列.
  1. rows = malloc(count * sizeof(Row*)); // This is probably done somewhere
  2.  
  3. row->columns = malloc(sizeof(char*) * headcnt);
  4. row->numcol = 0;
  5.  
  6. ...
  7.  
  8. row->numcol = colcnt;
  9. rows = realloc(rows,(rowcnt+1) * sizeof(Row*));
  10. rows[rowcnt++] = row;

现在如果你的清理

  1. void cleanUp(){
  2. int i = 0;
  3. int j = 0;
  4.  
  5. for (i = 0; i < rowcnt; i++){
  6. free(rows[i]->columns);
  7. }
  8. free(rows);
  9. exit(0);
  10. }

猜你在找的C&C++相关文章