C语言动态变量内存释放时机 指针p与*p的释放区别
核心概念区分与问题解答
先明确代码中两个完全独立的内存对象,就能理清释放逻辑:
- 指针变量
p本身
它是foo函数内部的局部自动变量,存储在函数的栈帧中。它的内存会在foo函数执行结束、栈帧销毁时由编译器自动回收,不需要手动调用任何函数处理。 malloc分配的堆内存
调用malloc(sizeof(int))时,系统会在进程的堆区申请一块大小为sizeof(int)的内存,malloc的返回值就是这块堆内存的首地址,你把这个地址赋值给了p存储。*p是对p存储的地址做解引用操作,代表的就是这块堆内存上存储的int值。
释放相关问题解答
- 你给出的代码中没有调用
free(p),因此这块malloc申请的堆内存在程序运行过程中永远不会被主动释放,你的猜测基本正确:只要程序不退出、没有主动调用free,这块内存就会一直被占用,属于典型的内存泄漏。只有当整个程序运行结束退出时,操作系统才会回收该进程的全部内存资源,这块内存才会被系统收回。如果foo函数被反复调用,会持续产生堆内存泄漏。 free函数的入参要求是malloc/calloc/realloc返回的内存首地址,也就是你存在p里的值,你需要手动释放的目标是这块堆内存,而非p本身的栈内存。
内容的提问来源于stack exchange,提问作者Sam12
相关产品推荐
相关产品推荐

