在 C 中,将 avoid *
作为参数传递给free
函数是不好的做法吗?如果不是,该函数如何知道从void *
指向的位置开始释放多少内存?
4 回答
free()
只需要内存块的起始地址;它的内容无关紧要。这就是为什么它实际上void*
在它的签名中有 a (所以不管你传递什么样的指针,它总是会得到 a void*
)。
该
free()
函数释放由 指向的内存空间ptr
,该空间必须由先前调用或malloc()
所返回。calloc()
realloc()
如您所见,您只能释放由这些函数之一分配的内存 - 它们在内部存储块的大小。
如果您好奇,甚至不需要将信息存储在单个位置的单独结构中;例如,默认malloc
/的各种替换通常free
会分配 N+M 字节的内存,其中 M 是元数据结构的大小。在该分配返回的地址,它们存储自己的元数据(例如分配的大小),然后返回 ptr+M 指向元数据之后的内存。
当释放该内存时,它可以简单地从地址中减去 M 以获得指向元数据的初始指针。
free 不需要数据类型,void *
可以正常工作。释放多少内存是内部管理的。重要的是您传递给free
以前从兼容的分配函数获得的值:malloc
它是朋友。
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.
没有真正释放内存,它只是允许其他程序在这里也分配内存。顺便说一句,如果你想要正确的内存长度,你就有这个功能strlen
。(不确定那个)