malloc内存分配相关疑问:新指针需调用free吗?仅释放主指针足够吗?
问题解答
1. 创建指向malloc分配内存区域的新指针时,是否需要调用free?
绝对不需要——而且绝对不能对这类新指针调用free()。
原因很简单:free()函数的规则非常严格,它只接受由malloc()、calloc()或realloc()返回的原始起始指针。如果你传入的是指向这块内存内部某个位置的指针(也就是你说的“新指针”),会触发未定义行为——可能是程序直接崩溃,可能是内存泄漏,甚至可能破坏其他内存区域的数据,排查起来非常麻烦。
2. 代码场景中是否需要释放miniArray?仅释放parentArray足够吗?
先把你的代码修正下(看起来free(myArr)是笔误,应该是free(parentArray)):
char * parentArray = malloc( 10 * sizeof(char)); char * miniArray = &parentArray [1]; free(parentArray); // 正确的释放方式 // free(miniArray) ? —— 绝对不要这么做!
这里只需要释放parentArray就完全足够了,miniArray根本不需要(也不能)单独释放。
背后的逻辑:
malloc(10 * sizeof(char))会分配一块连续的10字节内存,parentArray指向这块内存的起始地址。而miniArray只是指向了这块内存里的第2个字节(数组下标从0开始),它本质上是一个“内部指针”,并没有独立申请新的内存。
当你调用free(parentArray)时,整个10字节的内存块都会被操作系统回收。此时miniArray会变成悬空指针(指向已经被释放的内存),之后不能再使用,但它本身不需要被free——因为它从来不是malloc返回的原始指针。
额外提醒:
- 永远只对
malloc系列函数返回的原始指针调用free,一次分配对应一次释放,不要多也不要少。 - 释放原始指针后,记得把所有指向这块内存的子指针置为
NULL,避免后续误操作悬空指针导致的问题。
内容的提问来源于stack exchange,提问作者Tom Mathew
相关产品推荐
相关产品推荐

