我只对Linux懂 对windows仅限于游戏使用,所以我还是用Linux来说
先看从语言角度来看内存管理:
C语言中,提供了标准库函数malloc/free来申请内存和释放内存,在C++中提供了运算符new/delete来申请内存和释放内存,可以这样理解,后者是前者的泛化,用malloc申请内存,并不对内存进行实例化,就是简单的给你一块内存,至于在内存中存放什么类型的实体并不知道,但是C++中用new申请的内存,会把内存实例化,就是指明了内存存放的东西是什么类型。相信大家听过C中的malloc内存管理器吧,malloc内存管理器是管理可分配的虚拟内存的,专门支持malloc函数和free函数的功能,而C++程序中,既有malloc内存管理器,也有new(暂时取这个名字)内存管理器,后者专门支持new和delete运算符功能,这就是为什么如果用malloc申请的内存用delete释放,肯定是要出问题的
在来内存泄漏的问题:
我这里假设malloc管理器总共管理的虚拟内存有1M,你用malloc函数申请了512KB,在管理器内部,有2个表,一个用于记录空闲的内存大小,一个用于记录分配的内存大小,如果你调用了free,则管理器修改表,把释放的内存从第二个表中删除,并加入到第一个表中,有借有还,所以不会造成问题,但是你如果不调用free,那么第一个表的可用内存会越来越小,最终导致管理器的可以分配的内存不够,怎么办呢
留到操作系统内存管理在讨论,在new管理器中 原理和malloc管理器相似
操作系统的内存管理等会再说