在C中,将一个void *参数作为参数传递给free函数的不良实践?如果没有,该函数将如何从void *指向的位置开始知道要释放多少内存?
free()只需要内存块的起始地址; 它的内容无所谓.这就是为什么它实际上有一个void*签名(所以你通过什么样的指针无关紧要,它总会得到一个void*).
该
free()函数释放指向的内存空间ptr,该内存空间必须由之前的调用返回malloc(),calloc()或realloc().
如您所见,您可能只释放由这些函数之一分配的内存 - 并且它们在内部存储块的大小.
如果您感到好奇,甚至不需要将信息存储在单个位置的单独结构中; 例如,默认的各种替换malloc/ free分配N + M字节的内存是常见的,其中M是元数据结构的大小.在该分配返回的地址处,它们存储自己的元数据(例如分配的大小),然后返回ptr + M,它指向元数据之后的内存.
当释放该存储器时,它可以简单地从地址中减去M以获得指向元数据的初始指针.