【问题标题】:Memory leak on returning pointer返回指针时的内存泄漏
【发布时间】:2013-05-19 14:11:56
【问题描述】:

我在以下函数中面临内存泄漏情况。

char * readdatafromfile(unsigned pageNumber) {
    char *buff = (char*) malloc(sizeof(char) * pagesize);
    lseek(fd, pagesize * (pageNumber), SEEK_SET);
    read(fd, buff, pagesize);

    return buff;
}
//Read from file
char * readfromfile(char *fname, int pageno) {
    char *buff = NULL;
    fd = searchinvector(fname);
    if (fd > 0)
        buff = readdatafromfile(pageno);
    else
        printf("\nINDEX is not opened\n");
    return buff;
}

我正在尝试通过以下方式调用该函数

char* root_buf = readfromfile(fname,pageno);

谁能指出内存泄漏发生在哪里以及如何克服它。

编辑

我确实调用 free(root_buf);之后。忘了说那部分。我相信这与我正在创建一个指针并返回它的事实有关。可能引用被调用函数中的另一个指针捕获。

【问题讨论】:

  • 你永远不会打电话给free。这就是为什么你有泄漏。
  • 您似乎也有文件描述符泄漏。 (或者 fd 是一个全局变量?)
  • @wildplasser fd 只是帮助我将多个文件描述符存储在一个向量中。它是一个整数变量。
  • 代码中有一处分配了内存。所以这是唯一可能发生泄漏的地方。 valgrind 在哪里说你有泄漏?
  • @Rasmus malloc in readdatafromfile()

标签: c memory-management memory-leaks valgrind


【解决方案1】:

使用malloc 分配的内存永远不会再被释放。 如果您从呼叫站点执行此操作:

char* root_buf = readfromfile(fname,pageno); 
// do stuff
free(root_buf);

它应该可以解决泄漏。

【讨论】:

    【解决方案2】:

    你在这里使用 malloc。

    char *buff = (char*) malloc(sizeof(char) * pagesize); 
    

    你需要在使用完内存后释放它。

    在你完成 root_buf 并且不再需要它之后:

    free (root_buf);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 2019-07-17
      • 1970-01-01
      • 2012-07-07
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多