C语言如何知晓需释放的内存大小?指针移动后free能否释放全部内存?
问题解答
1. 能否释放全部已分配内存?
不能,这样写会触发未定义行为,根本无法正确释放内存。
free()函数要求传入的指针必须是malloc()/calloc()/realloc()返回的原始指针。你把notEncryptBuf偏移了20字节后,传入的已经不是最初分配的内存起始地址,free()无法定位到正确的内存块元数据,可能导致内存泄漏、程序崩溃,甚至破坏堆结构引发更严重的问题。
2. C语言如何知晓要释放的内存大小?
当你调用calloc()这类分配函数时,系统会在返回给你的指针前方额外分配一小块内存,用来存储该内存块的元数据——其中就包含了分配的内存总大小、内存块的状态(已分配/空闲)等信息。
当调用free()时,它会通过传入的原始指针向前偏移,找到这块元数据,从中读取内存大小,进而完成整个内存块的释放操作。但如果传入的是偏移后的指针,free()会找错元数据的位置,自然无法正确处理。
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

