难道只有new或malloc的时候会内存泄漏吗,还有其他什么情况

daphant 2003-08-23 09:21:44
我的程序中没有用到new,malloc关键字,但是在9x系统下,内存资源再减少,请问还有什么其他的情况会产生内存泄漏, 我怀疑是重复画图造成的,我用了 CDC,但我已经ReleaseDC(pDC)了
...全文
78 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuguilin 2003-08-25
  • 打赏
  • 举报
回复
我顶
lionhu2003 2003-08-25
  • 打赏
  • 举报
回复
不好意思,刚才没有写完就按了回复了
接着来

你的pen还和CDC指针绑定在一起,
所以这一句pen.DeleteObject();没有作用,并不能删除pen
而且你自己定义的CBrush也没有删除。

我想应该这样把

CDC *pDC = GetDC();
CBrush *pOldBrush;
CPen *pOldPen;
CBrush SolidBrush(RGB(30,30,30));
pOldBrush=pDC->SelectObject(&SolidBrush);//不同
pDC->Rectangle(CRect(100,170,750,370));
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(90,170,30));
pOldPen=pDC->SelectObject(&pen);//不同
pDC->MoveTo(100,210);
pDC->LineTo(750,210);
pdc->SelectObject(pOldBrush);//加上
pDC->SelectObject(pOldPen)//加上
ReleaseDC(pDC);
这样就把你自己定义的刷子和笔和CDC断开了联系,由于SolidBrush
和pen是局部变量,所以他们可以自动析构!

lionhu2003 2003-08-25
  • 打赏
  • 举报
回复

你的pen还和CDC指针绑定在一起,
所以这一句pen.DeleteObject();没有作用,并不能删除pen
而且你自己定义的CBrush也没有删除。

我想应该这样把

CDC *pDC = GetDC();
CBrush *pOldBrush;
CPen *pOldPen;
CBrush SolidBrush(RGB(30,30,30));
pOldBrush=pDC->SelectObject(&SolidBrush);//不同
pDC->Rectangle(CRect(100,170,750,370));
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(90,170,30));
pOldPen=pDC->SelectObject(&pen);//不同
pDC->MoveTo(100,210);
pDC->LineTo(750,210);
pdc->SelectObject(pOldBrush);


ReleaseDC(pDC);
daphant 2003-08-25
  • 打赏
  • 举报
回复
请大家帮忙看一下,下面的代码测试由内存泄漏,但是我实在看不出来时哪里泄漏了
CDC *pDC = GetDC();
CBrush SolidBrush(RGB(30,30,30));
pDC->SelectObject(&SolidBrush);
pDC->Rectangle(CRect(100,170,750,370));
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(90,170,30));
pDC->SelectObject(&pen);
pDC->MoveTo(100,210);
pDC->LineTo(750,210);
pen.DeleteObject();
ReleaseDC(pDC);
duqiang2050 2003-08-23
  • 打赏
  • 举报
回复
使用动态创建的对象没释放也会
mfq 2003-08-23
  • 打赏
  • 举报
回复
创建一个MFC 封装对象的时候,没有释放也会
daphant 2003-08-23
  • 打赏
  • 举报
回复
多谢大家的回复,那还有什么情况会造成泄漏,希望大家能来总结一下。
mqbwx 2003-08-23
  • 打赏
  • 举报
回复
函数结束前str会被析构。什么叫把Cstring str放到头文件里?应该也不会泄漏吧。
zyzyandzyzy 2003-08-23
  • 打赏
  • 举报
回复
应该不会,函数好象自己会析构掉的
daphant 2003-08-23
  • 打赏
  • 举报
回复
我再想问一下比如
test()
{
CString str;
}
如果这个函数不停的循环,会不会内存泄漏,如果把Cstring str放到头文件里,会不会泄漏?
mqbwx 2003-08-23
  • 打赏
  • 举报
回复
还有别的,我知道的还有BSTR 如果不释放的话,也会有泄漏
akiko 2003-08-23
  • 打赏
  • 举报
回复
楼主这么问也不是办法。不如把你怀疑的代码注释掉,看看还出不出问题。什么时候发现注释掉某段代码后没问题了,打开这段代码问题又出来了,那么你就找到问题所在了。
brave_heart 2003-08-23
  • 打赏
  • 举报
回复
Windows的GDI资源也要释放,比如

You created a font using CreateFont(),

When you no longer need the font, call the DeleteObject function to delete it.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧