关于内存泄漏(理论层面):多次运行未释放malloc内存的释放疑问
内存泄漏后的内存回收问题
咱们得分两种场景来聊,答案完全不一样:
场景1:每次运行都是独立的进程实例
如果你是每次启动一次程序,运行完就退出,重复执行100次——那每一次程序结束后,操作系统都会把这个进程占用的所有内存(包括那15字节没手动free的)全部回收。说白了,操作系统才不管你程序里有没有主动释放堆内存,只要进程彻底退出,它就会把这个进程的所有资源(内存、文件句柄这类)都收回来。所以100次运行结束后,那总共1500字节的泄漏内存不会一直占用计算机内存,早就被系统释放了。
场景2:在同一个进程内重复执行100次malloc
如果是程序里写了个循环,在同一个进程里跑100次malloc(15)却从不free——那只要这个进程还在运行,这1500字节的内存就会一直被占用。只有当这个进程退出的时候,操作系统才会把这些没释放的内存回收。这种情况下,进程运行期间,这些泄漏的内存会一直占着进程的地址空间,要是循环次数更多,还会导致进程的内存占用持续上升。
补充点底层逻辑
操作系统对进程的内存是做隔离管理的,每个进程都有自己独立的虚拟地址空间。当进程终止时,OS会遍历这个进程的所有内存页,把它们标记为可用,还给系统。所以内存泄漏真正的危害是在进程运行期间导致内存占用持续飙升,甚至耗尽系统内存(比如长期运行的服务程序如果一直泄漏内存,时间久了会直接崩溃)。
内容的提问来源于stack exchange,提问作者נירייב שמואל
相关产品推荐
相关产品推荐

