【问题标题】:Freeing up memory allocated for an arbitrary position at an array释放分配给数组中任意位置的内存
【发布时间】:2015-10-06 17:16:09
【问题描述】:

我正在编写代码来管理对数组元素的插入和删除。我知道链表或其他一些数据结构更适合这种情况,但我仅限于使用数组。

用于数组分配的额外内存通过使用realloc() 函数进行管理。但是,对于删除,我必须释放分配给最后一个元素的内存。为此,我尝试使用free (a + n)n 代表最后一个元素,但是,这最终会导致崩溃:

*** Error in `./a.out': munmap_chunk(): invalid pointer: 
0x000000000158f018 ***
Aborted (core dumped)

我相信崩溃是意料之中的,因为操作系统管理着堆的分配列表,虽然a 本身已通过malloc() 分配,但操作系统不知道a + n 的任何分配,导致硬错误。

我应该如何释放存储在数组中的最后一个元素?

【问题讨论】:

  • 您不能释放单个数组元素。您只能释放malloc 返回的整个内存块。
  • 您可以使用realloc 缩小分配,就像使用它添加到分配中一样。

标签: c arrays pointers memory-management dynamic-memory-allocation


【解决方案1】:

使用realloc 缩小分配:

array_size--;
array = realloc(array, array_size);

【讨论】:

  • 这样有可能底层堆分配实际上不会被调整大小?
  • 是的,这是可能的。内存管理器可以在各种粒度级别上运行。如果分配没有缩小到下一个阈值以下,则无需调整大小。
  • 如果你需要对内存分配进行详细的控制,你不应该使用malloc,你需要自己编写内存管理器。
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 2012-04-10
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多