关于C++中的内存泄露
1.c++内存泄漏的定义:
内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
2.内存泄漏的后果:
最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。 只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能降低到内存完全用尽。 更糟的是,泄漏的程序可能会用掉太多内存,导致另一个程序失败,而使用户无从查找问题的真正根源。 此外,即使无害的内存泄漏也可能会引发各种 问题,更有可能导致系统崩溃。
3.主要关注两种类型的内存泄漏:
(1)堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc ,new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.
(2)系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。
4.检测内存泄露的方法:
(1)调试运行DEBUG版程序,运用以下技术:CRT(C run-time libraries)(_CrtDumpMemoryLeaks()
)、运行时函数调用堆栈、内存泄漏时提示的内存分配序号(集成开发环境OUTPUT窗口),综合分析内存泄漏的原因,排除内存泄漏。
(2)运行的时候用valgrind跑,可以检查运行时候存在的内存泄漏。
参考资料:
C++怎么检测内存泄露,怎么定位内存泄露? (知乎)
C++不用工具,如何检测内存泄漏? (知乎)
下面这样就会发生内存泄露,需要free 或者 delete。
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
using namespace std;
void GetMemory(char *p, int num)
{
p = (char*)malloc(sizeof(char)* num);
//free(p);
//delete p;
}
int main(int argc, char** argv)
{
char *str = NULL;
GetMemory(str, 100);
cout << "Memory leak test!" << endl;
_CrtDumpMemoryLeaks(); //检测内存泄露
return 0;
}
运行上面代码会出现检测信息(此时发生内存泄露):
Detected memory leaks!
Dumping objects ->
c:\users\lzyrapx\documents\visual studio 2013\projects\test\test\test.cpp(9) : {145} normal block at 0x00D79F18, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.