使用MFC编程的朋友们都知道,当我们如下调用了:
CDC *pDC=GetDC();//获得窗口的设备描述表
接下来我们做完绘图功能后要调用:
ReleaseDC(pDC);//释放设备描述表
这样做的目的,可以避免内存泄露。如果您不小心在视频流中忘记释放设备描述表,您的程序很快就会崩溃。
这里我们说明几种在MFC、C++中容易产生内存泄露的地方,希望朋友们在今后编程中多加小心。
一、类构造函数申请内存,而析构函数没有释放。具体例子如下:
CDemo::CDemo()//构造函数
{
//TODO: add construction code here,
pChar= new char[100];
}
CDemo::~CDemo()//析构函数
{
//一定不要忘了添加如下代码
if(NULL!= pChar)
{
delete[] pChar;
}
}
二、上述情况出现在函数中的局部变量。具体例子如下:
void fun()//构造函数
{
//TODO: add construction code here,
pChar= new char[100];
//使用pChar
//使用完毕pChar
//千万不要忘记,以下步骤
delete[] pChar;
}
三、正如我们文章开头所讲的设备描述表的释放。具体例子如下:
CDC *pDC=GetDC();//获得窗口的设备描述表
//使用pDC
//使用完毕pDC
//不要忘记加入以下代码
ReleaseDC(pDC);//释放设备描述表
这里我要说明一种特殊情况,就是当前代码中,通过指针变量获得另外一个窗口的pDC,也不要忘记通过该指针变量释放掉pDC。具体例子如下:
extern CDemoDlg pCDemoDlg;//外部定义的,对话框指针变量
CDC *pDC=pCDemoDlg->GetDC();//获得窗口的设备描述表
//使用pDC
//使用完毕pDC
//不要忘记加入以下代码
pCDemoDlg->ReleaseDC(pDC);//释放设备描述表
四、CPen的释放。具体例子如下:
CPen penRed;//定义pen
penRed.CreatePen(PD_SOLID,1,RGB(255,0,0);//红色
CDC *pDC=GetDC();//获得窗口的设备描述表
CPen* pOldPen =pDC->SelectObject(&penRed);//选入设备描述表,并保存原有设备描述表
//使用pDC
//使用完毕pDC
//不要忘记加入以下代码
::DeleteObject(penRed.m_hObject);//释放penRed
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);//释放设备描述表
五、CFont的释放。具体例子如下:
CFont Font;//定义Font
Font.CreateFont(24,24,0,0,FW_NORMAL,0,TRUE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,"宋体");
CDC *pDC=GetDC();//获得窗口的设备描述表
CFont *pOldFont = pOldFont =pDC->SelectObject(&Font);
pDC->TextOut(10,10,"同一个世界,同一个梦想!");//使用Font
pDC->SelectObject(pOldFont);
Font.DeleteObject();//释放Font
ReleaseDC(pDC);//释放设备描述表
六、总结
以上五种情况,其实都有重复。但是对于我们而言,内存释放问题是我们在代码书写中的一个必须关注的问题,所以多说也不会嫌烦。代码比较少的时候,且代码运行时间比较短,内存泄露问题都不会引起我们的注意。
但是,当您的代码较大、运行时间较长时,就不得不关注内存丢失问题。所以我们应该从平时的习惯做起,养成一个释放内存的好习惯。
有时我们在线程、定时器或者其他重复调用次数较多的函数中丢失了内存,那么您的电脑基本很卡,一般死机的情况将会出现。所以,这个问题一定引起您的重视。