【问题标题】:Using free() after realloc()在 realloc() 之后使用 free()
【发布时间】:2017-02-06 17:45:41
【问题描述】:

如果我们使用 realloc() 来扩展一个数组,我们需要在指向旧数组的指针上调用 free() 吗? Realloc() 有时会使用内存中的同一位置进行扩展,所以我担心调用 free() 会释放我新扩展的数组。

另外,使用 realloc() 是深度复制数组的好主意吗?

【问题讨论】:

  • 不,你没有。如果realloc 调用成功,旧指针会自动失效。
  • "使用 realloc() 是深度复制数组的好主意吗?"不,realloc 不能保证执行数组的深拷贝。这也不是它的意图。

标签: c memory-management


【解决方案1】:

如果我们使用 realloc() 来扩展一个数组,我们需要在指向旧数组的指针上调用 free() 吗?

没有。如果realloc() 成功,那么realloc() 将为您传递的旧指针处理内存管理(这就是为什么realloc() 要求您传递使用malloc/calloc/realloc 或NULL 分配的指针。如果通过NULLrealloc(),则相当于调用malloc(),请求大小相同)。

来自7.22.3.5 The realloc function

realloc 函数释放 ptr 指向的旧对象,并返回一个指向具有 size 指定大小的新对象的指针。新对象的内容应与释放前旧对象的内容相同,直至新旧大小中的较小者。新对象中超出旧对象大小的任何字节都具有不确定的值。

(强调我的)。

如果对realloc() 的调用失败,您只需要free()。例如:

/* 'old_ptr' was allocated using malloc/realloc/calloc or it's NULL. */
char *new_ptr = realloc(old_ptr, new_size);
if (!new_ptr) {
   perror("realloc");
   free(old_ptr);
   exit(1);
}
old_ptr = new_ptr;
...

realloc() 使用的常见模式。

使用 realloc() 是深度复制数组的好主意吗?

这真的取决于具体的用例。过于频繁地调用realloc() 可能是不可取的(例如,重新分配比先前大小多1 个字节会导致大量复制)。通常,新尺寸会使用基于应用程序的良好策略来增加。每次需要 realloc() 时加倍它是一种常见的策略。

【讨论】:

    【解决方案2】:

    如果realloc 成功,你应该在旧指针上调用free; realloc 已经处理好了。

    【讨论】:

    • 谢谢。我阅读了这个文档大约 3 次,但在其中的任何地方都找不到它:/ pubs.opengroup.org/onlinepubs/009695399/functions/realloc.html
    • @user3724404 - 在您在上面评论中提供的链接中,请注意这一行:“如果内存对象的新大小需要移动对象,则 对象被释放"
    • 如果新尺寸不需要移动对象?那么旧指针会发生什么?它不能被释放,因为这会释放新指针指向的东西......
    • @user3724404 - 这没什么区别。当您将realloc 返回的值分配给旧指针时,您仍然可以获得稍后需要释放的内存的句柄。
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多