【发布时间】: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 并让其他所有东西都悬空吗?如果是这样,回收此内存的正确方法是什么?
【问题讨论】:
-
malloc和free的实现保留了有关已分配和释放的信息。 -
有很多内存分配器是开源的,你可以看看它们是如何工作的。一种方法是分配一点额外的空间来存储大小,并返回一个指向大小后第一个字节的指针。
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