1

在 C 中,将 avoid *作为参数传递给free函数是不好的做法吗?如果不是,该函数如何知道从void *指向的位置开始释放多少内存?

4

4 回答 4

8

free()只需要内存块的起始地址;它的内容无关紧要。这就是为什么它实际上void*在它的签名中有 a (所以不管你传递什么样的指针,它总是会得到 a void*)。

free()函数释放由 指向的内存空间ptr,该空间必须由先前调用或malloc()所返回。calloc()realloc()

如您所见,您只能释放由这些函数之一分配的内存 - 它们在内部存储块的大小。


如果您好奇,甚至不需要将信息存储在单个位置的单独结构中;例如,默认malloc/的各种替换通常free会分配 N+M 字节的内存,其中 M 是元数据结构的大小。在该分配返回的地址,它们存储自己的元数据(例如分配的大小),然后返回 ptr+M 指向元数据之后的内存。

当释放该内存时,它可以简单地从地址中减去 M 以获得指向元数据的初始指针。

于 2012-07-29T10:11:40.680 回答
0

free 不需要数据类型,void *可以正常工作。释放多少内存是内部管理的。重要的是您传递给free以前从兼容的分配函数获得的值:malloc它是朋友。

于 2012-07-29T10:11:45.457 回答
0

free()实现应该从传递的指针中知道要释放的堆单元有多大。指针必须从malloc()calloc()获得realloc()。确切的方式可能因平台而异 - 为了可移植代码,不应假设任何技术细节。

void* is a good way to specify argument type, because then it can enjoy implicit downgrade conversion from any other pointer type.

于 2012-07-29T10:55:54.603 回答
-1

没有真正释放内存,它只是允许其他程序在这里也分配内存。顺便说一句,如果你想要正确的内存长度,你就有这个功能strlen。(不确定那个)

于 2012-07-29T10:21:40.047 回答