【问题标题】:Calloc() is asigning previously assigned memoryCalloc() 正在分配先前分配的内存
【发布时间】:2016-06-19 01:56:24
【问题描述】:

我正在开发一个 C 项目,结果发现在某个特定时刻,我调用了 calloc() 函数,它分配了一个已经在使用中的内存块。这怎么可能?我检查了我的内存分配使用情况,每次我调用 malloc/calloc 时,我都会调用 free(pointer_to_the_allocated_memory) 。因此,这不是内存泄漏问题,也不是两次释放的指针。 我没有粘贴我的代码,因为它是用于大学工作的,我还没有发送它。 欢迎任何类型的帮助/建议。 提前致谢。

【问题讨论】:

  • 尝试使用类似 valgrind 的工具来跟踪/调试您的内存使用情况。
  • 注意每个程序都有自己的虚拟内存空间。
  • 你能发布一些与原版类似的东西吗?有很多人询问他们不想直接共享的专有代码,但他们通常会举例说明。你能在更小的范围内重现这种情况吗?
  • 另外,当你说“已经在使用”时,你是指同一个进程,还是另一个进程?因为就像@sjsam 说的,操作系统给每个进程自己的内存空间,可能看起来是重叠的。

标签: c memory malloc free calloc


【解决方案1】:

有可能两个指针指向同一个地方。

p1 = malloc(sizeof(int));
/* ... */
p2 = p1;
/* ... */
free(p1);
/* ... */
p3 = malloc(sizeof(int)); /* may allocate the block already used by p2 */

请注意,它通常并不那么明显。它可能通过指针算法(即p2++)发生,或者不同的部分可能在不同的函数中完成。

另一种可能性是你释放了一个指针而没有注意到它:

p1 = malloc(sizeof(int));
foo(p1); /* this function calls free(p1) */
p2 = malloc(sizeof(int)); /* may allocate the block already used by p1 */

【讨论】:

  • 应该注意,虽然可能,但不太可能,也没有办法知道你写的场景会发生。这都是非常特定于编译器实现的。
  • 鉴于 calloc() “分配了一个已经在使用的内存块”这一事实,这很可能。要分配一个正在使用的内存块,该块应该被释放或从不分配。
  • 感谢用户31264的回答
猜你喜欢
  • 2019-11-11
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多