传递一个空虚*到功能不好的做法?

时间:2012-07-29 10:09:49

标签: c pointers

在C中,是否将void *作为参数传递给free函数错误练习?如果没有,该函数将如何从void *指向的位置开始知道要释放多少内存?

4 个答案:

答案 0 :(得分:8)

free()只需要内存块的起始地址;它的内容无所谓。这就是为什么它的签名中实际上有一个void*(因此无论你传递什么样的指针都没关系,它总会得到一个void*)。

  

free()函数释放了ptr指向的内存空间,该内存空间必须在之前调用malloc()calloc()realloc()时返回

如您所见,您可能只释放由其中一个函数分配的内存 - 并且它们会在内部存储块的大小。


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

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

答案 1 :(得分:0)

免费不需要数据类型,void *将正常工作。内部管理释放多少内存。重要的是,您将先前从兼容分配函数获得的值传递给freemalloc并且它是朋友。

答案 2 :(得分:0)

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

void*是指定参数类型的好方法,因为它可以享受任何其他指针类型的隐式降级转换。

答案 3 :(得分:-1)

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