【问题标题】:Dynamic memory deallocating issue in cc中的动态内存释放问题
【发布时间】:2021-04-24 02:40:15
【问题描述】:

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int *mem(void){

  //int buf[]= {1,1,2,3};
  int *buf = malloc(2 * sizeof(int));
  buf[1] = 1;

  return buf;
  free(buf);
}

int main(void){

  int *a[1] = { &mem()[1] };
    
  printf("%d", *a[0]};
  free(a[0]);
  return 0;

}

正如预期的那样,输出为 1,但是当我检查 Valgrind 时,出现内存泄漏,显示 3 个分配和 2 个释放。我不想在这里使用static

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 为什么在一个函数中将free 放在return 之前,而在另一个函数中却相反?
  • 您的a[0] 实际上是&amp;buf[1]。释放内存的正确方法是将malloc() 函数返回的确切值传递给free() 函数。只是为了好玩尝试free(a[0] - sizeof(int));
  • free(buf) 无法访问 - 您是否记得启用一组合理的编译器警告?如果你有,你可能需要一个更好的编译器......

标签: c memory-leaks


【解决方案1】:

内存泄漏在这里应该是一个较小的问题。您的程序正在调用未定义的行为,因为您正在释放不是 mallocd 的内存。

将这两行添加到您的程序中以查看程序发生了什么:

printf("Returning %p\n", buf);
return buf;

printf("%d at %p\n", *a[0], a[0]);
free(a[0]);

输出应该是这样的:

Returning 0x602000000010
1 at 0x602000000014

在下一次调用free 时,会传入地址0x602000000014,它不是mem() 中分配的内存。 freed 的内存与由于我(也可能是您的)系统上的 int 的大小而分配的内存之间存在完整的 4 字节差异,即 &amp;buf[0]&amp;buf[1] 相差 4 个字节。

把你的程序改成

int *a[1] = { &mem()[0] }; //point to the 0-th index of the returned buffer
printf("%d", a[0][1]); //get the 1-st index of the array pointed to by the a[0] pointer

要有正确的行为。另外,还有一件事。 return 后的语句不执行。 free(buf)mem() 中是多余的。

编辑:这是在进行更改后运行 valgrind 后的输出:

$valgrind --leak-check=full --show-leak-kinds=all  --track-origins=yes  --verbose  ./test

==3497== HEAP SUMMARY:
==3497==     in use at exit: 0 bytes in 0 blocks
==3497==   total heap usage: 2 allocs, 2 frees, 520 bytes allocated
==3497==
==3497== All heap blocks were freed -- no leaks are possible
==3497==
==3497== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

【讨论】:

  • 感谢您的回复,我确实实现了这一点,但 valgrind 中仍然存在内存泄漏问题,说有 2 个分配和 1 个空闲。
  • @Deekshagowda 我粘贴了更正程序的 valgrind 输出。您用于 valgrind 的选项是什么?它仍然在哪里检测到泄漏?更正程序后,应该没有任何泄漏。您分配了一个内存块,然后释放了内存块。它指向的泄漏是什么?它是否指向任何特定的代码位置?
  • @Deekshagowda 也可能是一个愚蠢的建议,但我希望您在进行更改后重新编译您的程序并将新的二进制文件用作 Valgrind 输入?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多