C语言动态内存释放实践咨询:代码示例相关疑问
#include <stdio.h> #include <stdlib.h> char *test(void); int main() { char *base_ptr = NULL; base_ptr = test(); for (char i = 0; i < 5; i++) { printf("base_ptr[%hhi] = %hhi\n", i, base_ptr[i]); } free(base_ptr); return 0; } char *test(void) { char *local_ptr = NULL; local_ptr = (char *)malloc(5*sizeof(char)); for (char i = 0; i < 5; i++) { scanf(" %hhi", &local_ptr[i]); } return local_ptr; }
动态内存管理疑问解答
1. 这种内存释放方式是否存在内存泄漏风险,是否属于良好实践?
这种方式没有内存泄漏风险,而且是C语言里非常常规的良好实践。
malloc分配的是堆内存,test函数结束时销毁的只是栈上的local_ptr指针变量本身,它指向的堆内存并不会被自动回收。main函数接收返回的指针后,在使用完成后调用free释放堆内存,整个流程完全符合动态内存管理规则。这种“分配方返回指针,调用方负责释放”的模式在C标准库中也很常见,比如strdup函数就是这种逻辑。
2. 函数结束或return时的内存释放与free函数释放动态内存是否等同?
完全不等同,两者针对的是完全不同的内存区域:
- 函数结束时释放的是栈上的自动变量(比如
test里的local_ptr),这类内存属于自动存储期,由系统自动管理,函数栈帧销毁时会被自动回收,不需要开发者手动操作。 free释放的是堆上的动态分配内存,这类内存属于动态存储期,系统不会自动回收,必须由开发者手动调用free来释放,两者的管理机制和作用对象没有任何交集。
3. test函数执行结束后其占用的内存被释放,此时如示例中那样访问该地址是否存在危险?
没有危险。
test函数结束后被释放的是它的栈帧内存(比如local_ptr这个指针变量的存储空间),但它返回的是堆内存的地址——这块堆内存并没有被释放,main里的base_ptr持有合法的堆内存地址,访问base_ptr[i]是完全合法的操作。- 只有当调用
free(base_ptr)之后再去访问该地址,才会出现野指针访问的危险。
内容的提问来源于stack exchange,提问作者Sandrious
相关产品推荐
相关产品推荐

