【问题标题】:Use of free with variable pointers [duplicate]使用带有变量指针的free [重复]
【发布时间】:2016-05-29 11:29:33
【问题描述】:

来自 cplusplus.com:

先前通过调用 malloc、calloc 或 realloc 分配的内存块被释放,使其再次可用于进一步分配。

如果 ptr 没有指向使用上述函数分配的内存块,则会导致未定义的行为。

如果 ptr 是空指针,则函数什么也不做。

请注意,此函数不会更改 ptr 本身的值,因此它仍然指向相同(现在无效)的位置。

但是如果我的指针没有指向块的开头会发生什么。

例如:

int *ptr = malloc(sizeof(int)*10);

ptr++;

free(ptr);

free 是否只释放最后 9 个位置?在这种情况下,这将是可怕的,那么:

int *ptr = malloc(sizeof(int)*10);
int i;

for(i=0; i<10; i++, ptr++);

free(ptr);

这里 ptr 指向 malloc 保留的内存块之外。

这会是什么行为?

int *ptr1 = malloc(sizeof(int)*10);
int *ptr2 = ptr1 + 2;

free(ptr2);

谢谢。

【问题讨论】:

  • free 必须完全匹配 malloc,或者 UB
  • 您只能将mallocrealloccalloc返回的确切指针传递给free。您无法将修改后的指针传递给free,而不会遇到未定义的行为。
  • 答案直接在您粘贴的内容中:如果 ptr 未指向分配有上述函数的内存块,则会导致未定义的行为。 指向除start 与不指向块相同。
  • 当你说我必须传递 malloc 系列返回的确切指针时,你是指变量本身还是内存方向?这会合法吗? int *ptr1 = malloc(sizeof(int)*10); int *ptr2 = ptr1;免费(ptr2);
  • @jumer malloc() 返回的 value 是必须提供给 free() 的值。您如何管理该值的存储取决于您的需要,但在您的简单示例中,未修改的变量就足够了。

标签: c pointers memory-management malloc free


【解决方案1】:

如果尝试对free 修改(增加)指针,您将有内存泄漏(失败free)或损坏malloc 链。

【讨论】:

  • 或者……你的程序可能会崩溃。你不确定会发生什么,你只知道行为是undefined
  • 从没听说过failed free(),你能引用一下吗?
  • 此外,恕我直言,"You will have memory leak" 是错误的,因为这远不能保证。
  • @mah 程序崩溃将是内存混乱的副作用。
  • @i486 你似乎不明白......你正在根据轶事证据预测会发生什么。问题是您的预测不是基于定义的期望;唯一有效的期望是“未定义的行为”,它可能会说“我们真的不知道会发生什么,但它可能是不可取的”。这使您的答案有点用处不大。
猜你喜欢
  • 2015-12-27
  • 2013-11-10
  • 1970-01-01
  • 2021-11-11
  • 2021-08-04
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多