MFC C++ 中的内存释放问题

       使用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);//释放设备描述表

六、总结

      以上五种情况,其实都有重复。但是对于我们而言,内存释放问题是我们在代码书写中的一个必须关注的问题,所以多说也不会嫌烦。代码比较少的时候,且代码运行时间比较短,内存泄露问题都不会引起我们的注意。

      但是,当您的代码较大、运行时间较长时,就不得不关注内存丢失问题。所以我们应该从平时的习惯做起,养成一个释放内存的好习惯。

      有时我们在线程、定时器或者其他重复调用次数较多的函数中丢失了内存,那么您的电脑基本很卡,一般死机的情况将会出现。所以,这个问题一定引起您的重视。





















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值