【问题标题】:Reclaiming memory from dynamic array in C [duplicate]从C中的动态数组中回收内存
【发布时间】:2017-06-04 14:20:06
【问题描述】:
/*Pointer Array (Dynamic) EXAMPLE*/

int size = 0;
printf("Enter the size of the array you want:\n");
scanf("%d",&size);

int * Dptr = malloc(sizeof(*Dptr)*size);
if(!Dptr)
    return -1;

for(int i=0;i<size;i++)
    Dptr[i]= -7;

printf("Congratulations, you successfully allocated and wrote to a dynamic array.\n");

free(Dptr); //how does it "know" what to deallocate? Is everything getting proprely reclaimed?

在我用 C 语言写的一个小涂鸦之上,我有一个关于动态数组的内存分配的问题。最后我调用 free 函数来释放我分配的数组的内存,但我的问题是,它如何“知道”要释放多少内存?或者,它只是释放第一个 int 并让其他所有东西都悬空吗?如果是这样,回收此内存的正确方法是什么?

【问题讨论】:

  • mallocfree 的实现保留了有关已分配和释放的信息。
  • 有很多内存分配器是开源的,你可以看看它们是如何工作的。一种方法是分配一点额外的空间来存储大小,并返回一个指向大小后第一个字节的指针。 free 函数然后查看与它传递的指针的负偏移量以查找大小。除非您想编写自己的分配器,否则这并不是您真正需要知道的细节。
  • 实现存储分配的大小。我相信,它通常会存储在分配的内存之前。一些 malloc 实现具有 API(在 linux 上是 malloc_usable_size())来查找分配的大小,给定一个指针。
  • Or, is it just deallocating the first int and leaving everything else dangling? 这也太疯狂了。 :D
  • 这(内部记住的细节)就是为什么您必须只将指针值传递给已分配的free(或指针的副本,free 无法知道任何区别)。如果你传递malloc返回的指针,那么free将释放所有分配的内存。

标签: c memory-management dynamic-arrays


【解决方案1】:

free 调用释放整个缓冲区;单个 malloc 调用应对应于单个 free 调用。

至于它是如何知道的……嗯,这将取决于实现。但是,如果您只是想安心,请考虑一下:

如果系统知道缓冲区有多大,它怎么知道它可以在哪里开始下一次动态分配(如果你应该再次调用malloc而没有freed第一个缓冲区)?

这是内存管理库的全部职责。它适用于任何正确实施的系统。

【讨论】:

  • > 如果系统不知道有多大...实际上,这并没有回答 OP 问题,实际上 OP 怀疑 free() 泄漏内存... :- )
  • 有点,更像是我不确定我的使用是否不正确和内存泄漏。我相信这个功能,而不是我自己。 (;
  • @linuxfan - 错误。该问题专门询问系统是否/如何知道要释放多少内存,因为这是担心潜在内存泄漏的原因。关于它是否泄漏内存的更广泛的问题已经在我的第一句话中讨论过。
  • @MarkAdelsberger 这是个玩笑,但没有错。对于假设的损坏的内存管理器,可以在不记住单个块的大小的情况下连续分配内存,并在调用 releasemem() 指定要释放的数量时信任用户代码。空闲块将形成一个链表以在扩展堆之前尝试。当 RAM 非常昂贵时,我什至使用了这样的机制。
  • @linuxfan - 又错了。首先,您最初声称我的回答没有解决原始问题。然而确实如此。其次,你想象一个内存管理器的能力(你承认它无论如何都不能正常工作)与任何事情都没有关系。抱歉,您的迂腐尝试没有在这里得到回报,但这不会改变。
猜你喜欢
  • 2023-03-17
  • 2021-07-17
  • 2013-05-24
  • 2018-08-11
  • 2017-06-26
  • 2017-12-13
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多