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

六、总结

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

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

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


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC 程序分配足够的内存空间,可以使用标准 C/C++ 内存分配函数,例如 malloc 或 new。以下是一个示例代码,演示如何使用 malloc 函数分配内存空间: ``` int nSize = 100; // 要分配的内存大小 int* pData = (int*)malloc(nSize * sizeof(int)); // 分配内存空间 if (pData != NULL) { // 使用 pData 指向的内存空间 // ... // 释放内存空间 free(pData); } ``` 在上面的代码,我们首先定义了要分配的内存大小 nSize,并使用 malloc 函数分配了 nSize 个整数大小的内存空间。我们使用 pData 指向这块内存空间,进行读写操作。完成操作后,我们使用 free 函数释放内存空间,以避免内存泄漏。 需要注意的是,使用 malloc 函数分配的内存空间,在使用完后必须显式地释放。否则,会导致内存泄漏,使得程序的内存占用不断增加,最终可能导致程序崩溃。 除了 malloc 函数,也可以使用 C++ 的 new 运算符来分配内存空间,例如: ``` int nSize = 100; // 要分配的内存大小 int* pData = new int[nSize]; // 分配内存空间 if (pData != NULL) { // 使用 pData 指向的内存空间 // ... // 释放内存空间 delete[] pData; } ``` 在上面的代码,我们使用 new 运算符分配了 nSize 个整数大小的内存空间,并使用 delete[] 运算符释放内存空间。 需要注意的是,使用 new 运算符分配的内存空间,在使用完后也必须显式地释放。否则,也会导致内存泄漏。与 malloc 函数不同的是,使用 new 运算符分配的内存空间,可以自动调用对象的构造函数进行初始化,以及调用对象的析构函数进行清理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值