前段时间面试经常被问到内存泄漏。今天小总结一下:
内存泄漏的发生是由于用户在堆上分配了空间,但却没有释放它。持续的内存泄漏最终将导致堆的耗尽,后继的内存分配将会失败。
引发内存泄漏的原因是用new分配的内存没有用delete释放掉。如:可能在OnPaint这样的绘画窗口的函数中分配了空间,而仅仅在析构函数中释放了一份空间,而OnPaint被调用的次数与窗口的刷新的次数有关,这样就丢了另一部分空间。
Visual C++的调试器自动监测内存泄漏问题,这必须是在调试状态下,调试器会把程序运行中没有释放的内存显示到“Output”窗口中。MFC提供的CMemoryState类是帮助找到和删除程序中内存泄漏的一个工具。它仅仅在程序的Debug版本中存在,只能检查到使用new分配的内存。
当在Visual Studio中进行开发时,可以利用它的内存泄漏测试,所有不被引用的内存将被卸载和释放,程序使用了大量内存,或计算机内存短缺,就可以激活自己的CMemoryState对象,来在程序执行期定位内存泄漏。具体代码如下:
CMemoryState mem;
mem.CheckPoint();
int *i = new int;
mem.DumpAllObjectsSince();