关于这个程序:
1.是一个游戏程序。一只蚂蚁在特定区域运动。键盘控制运动方向。
2.创建画图备DC 在每一步我都DeleteDC(),我想这个已经处理好了
3.程序涉及到全局指针,这个不会处理
4.CPU占用率高,这个不知道怎么解决,也不知道什么原因CPU占用率高
这个可能是根KeyEvent有关
KeyEvent(GameEngine::GetGameEngine()->GetWindow()); //处理键盘消息
我的问题
一。C++程序运行时间越长,占用内存越多,最后导致程序不能运行?是什么原因引起的,怎么根踪或调试?
二。CPU占用率高,这个不知道怎么解决?不知道分析是否正确解决。有没有其它的好方法?
最后
就只有100分了,天气冷了,请大家注意加衣服。谢谢大家了。
.
42 个解决方案
#1
可能的情况:new了东西没有注意delete……
#2
任务管理器看看gdi资源占用多少 。。
用内存检测工具看看那里内存泄露了
用内存检测工具看看那里内存泄露了
#3
第一肯定是内存泄露了
第二你可以在debug下什么都不干,暂停程序看看程序暂停在哪里,多试几次
第二你可以在debug下什么都不干,暂停程序看看程序暂停在哪里,多试几次
#4
g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);
就只看到这个new 不过是没有看到delete
怎么delete呀
#5
可能是有的地方申请了内存没有释放了吧
内存占用太高,可能你的程序运算量太大,内存的申请与释放太快了
内存占用太高,可能你的程序运算量太大,内存的申请与释放太快了
#6
不需要GameEngine对象的时候就写
delete GameEngine呗……
不过楼主的问题应该不是出在这里吧?
正常设计下,这个new应该只会执行了一次(单件模式)……
#7
对呀,我想问题不是出现在这里
#8
恩,一般只执行一次的, 没必要delete.虽然delete一下更好。
应该是gdi 资源泄露吧
#9
恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?
#10
贴点看看
#11
找个内存泄露查找工具检查一下不就完了吗?
BoundsChecker
BoundsChecker
#12
任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
只能看代码找了
#13
谢谢你们呀,我刚才看了,就是gdi资源不断的增加
呵,这个在代码中找太麻烦了吧
#14
用BoundsChecker可以检查gdi资源泄露的。
#15
和C++无关的好吧! 你的代码有问题。
#16
我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀
#17
我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀
++++++++++++++++++
你有最新的key吗?
++++++++++++++++++
你有最新的key吗?
#18
估计是gdi资源频繁分配,删除的问题,全局指针new的地方看看是否需要删除的也得删除。
cpu很高看哪有循环,或者是你的这个检测key的事件得放在线程中运行,才不会导致主线程cpu过高。
cpu很高看哪有循环,或者是你的这个检测key的事件得放在线程中运行,才不会导致主线程cpu过高。
#19
这应该与运行环境无关吧,应该是内存分配和释放没有搭配好
#20
可能是你用的一些函数,比如一些C函数,内部的实现是用molloc来申请的,然后返回指针,而用的时候没有free
#21
友情顶贴。
#22
内存泄漏呗……
#23
先检查你的内存申请和释放的是否是一一对应的。、
cpu占用高说明你的程序里面循环过多,例如while for循环,而每个循环的每次处理都占用了大量的cpu,你把这些处理分开做,适当的sleep一下。
cpu占用高说明你的程序里面循环过多,例如while for循环,而每个循环的每次处理都占用了大量的cpu,你把这些处理分开做,适当的sleep一下。
#24
SysinternalsSuite -> procexp.exe 查看你的程序,看看是那个线程的 CPU 最高,而且可看一下当时的调用堆栈。
#25
泄露就,注释要部分代码,二分法哦,
#26
你可以用DevpartnerStudio 9.0.2来检测内存泄漏。这个软件相当的好用可以指明泄露的行号。
#27
谢谢大家
我用任务管理器看看gdi资源,一直增加
所以初步判断为
gdi资源泄露
BoundsChecker可以检查gdi资源泄露的,可以找出找码
由于我装的是vs2008 所以不会调试
具体测gdic以下方法
1、检查是否GetWindowDC(),后是否有 ReleaseDC()
2、CFont *pOldFont=pDC->SelectObject(&m_Font);
后是否有pDC->SelectObject(pOldFont);
3、CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
后是否记得bmp.DeleteObject();
现在贴上关键代码,帮我看一下
我用任务管理器看看gdi资源,一直增加
所以初步判断为
gdi资源泄露
BoundsChecker可以检查gdi资源泄露的,可以找出找码
由于我装的是vs2008 所以不会调试
具体测gdic以下方法
1、检查是否GetWindowDC(),后是否有 ReleaseDC()
2、CFont *pOldFont=pDC->SelectObject(&m_Font);
后是否有pDC->SelectObject(pOldFont);
3、CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
后是否记得bmp.DeleteObject();
现在贴上关键代码,帮我看一下
HDC MayiDituDC=CreateCompatibleDC(hDC); //创建内存兼容设备环境
HBITMAP hMayiDitu=CreateCompatibleBitmap(hDC,800,600);
SelectObject(MayiDituDC,hMayiDitu);
g_pMayiDitu->BltDitdu(MayiDituDC);//加载地图
//加载蚂蚁
HDC MayiDC=CreateCompatibleDC(hDC); //创建内存兼容设备环境
HBITMAP hMayi=CreateCompatibleBitmap(hDC,50,50);
SelectObject(MayiDC,hMayi);
g_pMayi->BltMayi(MayiDC,m);
COLORREF clrTrans;
clrTrans=GetPixel(MayiDC,2, 2);
TransparentBlt(MayiDituDC,g_ptMayi.x ,g_ptMayi.y,50,50,MayiDC,0,0,50,50, clrTrans);
//BitBlt(MayiDituDC,0,50,50,50,MayiDC,0,0,SRCCOPY);
//BitBlt(MayiDituDC,0,0,800,600,MayiDC,50,0,SRCPAINT);
BitBlt(hDC,0,0,800,600,MayiDituDC,0,0,SRCCOPY);
HDC MayiRectDC=CreateCompatibleDC(hDC);
HBITMAP hMayiRect=(HBITMAP)LoadImage(NULL,"resource/Mayirect/mayirect.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
SelectObject(MayiRectDC,hMayiRect);
//BitBlt(hDC,0,0,800,600,MayiRectDC,0,0,SRCCOPY);
DeleteObject(SelectObject(MayiDituDC,hMayiDitu));
DeleteObject(SelectObject(MayiDC,hMayi));
DeleteObject(SelectObject(MayiRectDC,hMayiRect));
DeleteDC(MayiDituDC);
DeleteDC(MayiDC);
DeleteDC(MayiRectDC);
DeleteDC(hDC);
ReleaseDC(hWnd,hDC);
#28
怎么看着create了5个,release和delete有7个啊
cpu在你核心线程得地方注意sleep,如果你这个线程做得事情比较少得话
cpu在你核心线程得地方注意sleep,如果你这个线程做得事情比较少得话
#29
SelectObject(MayiDituDC,hMayiDitu);
改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));
其它三个同样。
改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));
其它三个同样。
#30
为了怕gdi资源泄露 所以就多加了
#31
DeleteDC(hDC);
这个好像是多余的吧,如果你是用的GetDC
这个好像是多余的吧,如果你是用的GetDC
#32
我换了
HBITMAP OldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
出现以下错误
error C2440: '=' : cannot convert from 'HGDIOBJ' to 'HBITMAP'
#33
HGDIOBJ OldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
#34
29楼和33楼
改了gdi 资源还是不断增加
我以前都是直接用的
gdi 泄露该注意的地方,我都注意到了 还是不知道出现在什么地方
现在想要下一个DevpartnerStudio 9.0.2也就是BoundsChecker
这个需要10个资源分,等有了等下吧
改了gdi 资源还是不断增加
我以前都是直接用的
gdi 泄露该注意的地方,我都注意到了 还是不知道出现在什么地方
现在想要下一个DevpartnerStudio 9.0.2也就是BoundsChecker
这个需要10个资源分,等有了等下吧
#35
内存占用率渐渐升高,应该是不断申请内存但没有释放,前两天我写的程序也是这种现象,最后整个系统挂了,你仔细查查。
占用率高应该是某处有循环,或某些处理中涉及到大量的运算。
占用率高应该是某处有循环,或某些处理中涉及到大量的运算。
#36
内存泄露。
那个CPU占用率高的问题。
应该是算法不过关吧。
我这些在看一个围棋的程序。
没走一步棋要等好久。
我也没明白怎么回事呢。
那个CPU占用率高的问题。
应该是算法不过关吧。
我这些在看一个围棋的程序。
没走一步棋要等好久。
我也没明白怎么回事呢。
#37
C++程序运行时间越长,占用内存越多,最后导致程序不能运行
确定为gdi泄露 现贴上问题代码
而我在后面只
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
由于上面是一个循调用我只DeleteObject()
正确的应该为
for(i=0;i<rows*cols;i++)
{
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
}
这样就好了
这里要特别要谢谢韩卫平大哥 Loaden 等等 谢谢上面的所有的人
关于cpu占用率的问题我暂时还不知道用什么方法解决
确定为gdi泄露 现贴上问题代码
for(i=0;i<rows*cols;i++)
{
SelectObject(mdc,map[mapIndex[i]]);
rowNum=i/cols; //行数
colNum=i%cols; //列数
x=xstart+colNum*80;
y=ystart+rowNum*60;
//BitBlt(mdc,x,y,80,60,bufdc,0,0,SRCCOPY);
BitBlt(MayiDituDC,x,y,80,60,mdc,0,0,SRCAND);
BitBlt(MayiDituDC,x,y,80,60,mdc,0,0,SRCPAINT);
}
而我在后面只
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
由于上面是一个循调用我只DeleteObject()
正确的应该为
for(i=0;i<rows*cols;i++)
{
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
}
这样就好了
这里要特别要谢谢韩卫平大哥 Loaden 等等 谢谢上面的所有的人
关于cpu占用率的问题我暂时还不知道用什么方法解决
#38
gx
今天刚看到一个内存检测工具
Intel Parallel Inspector 是提供给 Microsoft Visual Studio* C/C++ 开发人员用于检测多线程错误的最方便的工具。与其它错误检查器不同,Parallel Inspector 能够最迅速全面地查明潜在的多线程与内存错误,以此来确保应用程序的稳定性。请使用Parallel Composer,Parallel Inspector 与 Parallel Amplifier 来创建优化的串行与并行应用程序。
今天刚看到一个内存检测工具
Intel Parallel Inspector 是提供给 Microsoft Visual Studio* C/C++ 开发人员用于检测多线程错误的最方便的工具。与其它错误检查器不同,Parallel Inspector 能够最迅速全面地查明潜在的多线程与内存错误,以此来确保应用程序的稳定性。请使用Parallel Composer,Parallel Inspector 与 Parallel Amplifier 来创建优化的串行与并行应用程序。
#39
#40
#41
路过~~~~~~
#42
#1
可能的情况:new了东西没有注意delete……
#2
任务管理器看看gdi资源占用多少 。。
用内存检测工具看看那里内存泄露了
用内存检测工具看看那里内存泄露了
#3
第一肯定是内存泄露了
第二你可以在debug下什么都不干,暂停程序看看程序暂停在哪里,多试几次
第二你可以在debug下什么都不干,暂停程序看看程序暂停在哪里,多试几次
#4
g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);
就只看到这个new 不过是没有看到delete
怎么delete呀
#5
可能是有的地方申请了内存没有释放了吧
内存占用太高,可能你的程序运算量太大,内存的申请与释放太快了
内存占用太高,可能你的程序运算量太大,内存的申请与释放太快了
#6
不需要GameEngine对象的时候就写
delete GameEngine呗……
不过楼主的问题应该不是出在这里吧?
正常设计下,这个new应该只会执行了一次(单件模式)……
#7
对呀,我想问题不是出现在这里
#8
恩,一般只执行一次的, 没必要delete.虽然delete一下更好。
应该是gdi 资源泄露吧
#9
恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?
#10
贴点看看
#11
找个内存泄露查找工具检查一下不就完了吗?
BoundsChecker
BoundsChecker
#12
任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
只能看代码找了
#13
谢谢你们呀,我刚才看了,就是gdi资源不断的增加
呵,这个在代码中找太麻烦了吧
#14
用BoundsChecker可以检查gdi资源泄露的。
#15
和C++无关的好吧! 你的代码有问题。
#16
我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀
#17
我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀
++++++++++++++++++
你有最新的key吗?
++++++++++++++++++
你有最新的key吗?
#18
估计是gdi资源频繁分配,删除的问题,全局指针new的地方看看是否需要删除的也得删除。
cpu很高看哪有循环,或者是你的这个检测key的事件得放在线程中运行,才不会导致主线程cpu过高。
cpu很高看哪有循环,或者是你的这个检测key的事件得放在线程中运行,才不会导致主线程cpu过高。
#19
这应该与运行环境无关吧,应该是内存分配和释放没有搭配好
#20
可能是你用的一些函数,比如一些C函数,内部的实现是用molloc来申请的,然后返回指针,而用的时候没有free
#21
友情顶贴。
#22
内存泄漏呗……
#23
先检查你的内存申请和释放的是否是一一对应的。、
cpu占用高说明你的程序里面循环过多,例如while for循环,而每个循环的每次处理都占用了大量的cpu,你把这些处理分开做,适当的sleep一下。
cpu占用高说明你的程序里面循环过多,例如while for循环,而每个循环的每次处理都占用了大量的cpu,你把这些处理分开做,适当的sleep一下。
#24
SysinternalsSuite -> procexp.exe 查看你的程序,看看是那个线程的 CPU 最高,而且可看一下当时的调用堆栈。
#25
泄露就,注释要部分代码,二分法哦,
#26
你可以用DevpartnerStudio 9.0.2来检测内存泄漏。这个软件相当的好用可以指明泄露的行号。
#27
谢谢大家
我用任务管理器看看gdi资源,一直增加
所以初步判断为
gdi资源泄露
BoundsChecker可以检查gdi资源泄露的,可以找出找码
由于我装的是vs2008 所以不会调试
具体测gdic以下方法
1、检查是否GetWindowDC(),后是否有 ReleaseDC()
2、CFont *pOldFont=pDC->SelectObject(&m_Font);
后是否有pDC->SelectObject(pOldFont);
3、CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
后是否记得bmp.DeleteObject();
现在贴上关键代码,帮我看一下
我用任务管理器看看gdi资源,一直增加
所以初步判断为
gdi资源泄露
BoundsChecker可以检查gdi资源泄露的,可以找出找码
由于我装的是vs2008 所以不会调试
具体测gdic以下方法
1、检查是否GetWindowDC(),后是否有 ReleaseDC()
2、CFont *pOldFont=pDC->SelectObject(&m_Font);
后是否有pDC->SelectObject(pOldFont);
3、CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
后是否记得bmp.DeleteObject();
现在贴上关键代码,帮我看一下
HDC MayiDituDC=CreateCompatibleDC(hDC); //创建内存兼容设备环境
HBITMAP hMayiDitu=CreateCompatibleBitmap(hDC,800,600);
SelectObject(MayiDituDC,hMayiDitu);
g_pMayiDitu->BltDitdu(MayiDituDC);//加载地图
//加载蚂蚁
HDC MayiDC=CreateCompatibleDC(hDC); //创建内存兼容设备环境
HBITMAP hMayi=CreateCompatibleBitmap(hDC,50,50);
SelectObject(MayiDC,hMayi);
g_pMayi->BltMayi(MayiDC,m);
COLORREF clrTrans;
clrTrans=GetPixel(MayiDC,2, 2);
TransparentBlt(MayiDituDC,g_ptMayi.x ,g_ptMayi.y,50,50,MayiDC,0,0,50,50, clrTrans);
//BitBlt(MayiDituDC,0,50,50,50,MayiDC,0,0,SRCCOPY);
//BitBlt(MayiDituDC,0,0,800,600,MayiDC,50,0,SRCPAINT);
BitBlt(hDC,0,0,800,600,MayiDituDC,0,0,SRCCOPY);
HDC MayiRectDC=CreateCompatibleDC(hDC);
HBITMAP hMayiRect=(HBITMAP)LoadImage(NULL,"resource/Mayirect/mayirect.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
SelectObject(MayiRectDC,hMayiRect);
//BitBlt(hDC,0,0,800,600,MayiRectDC,0,0,SRCCOPY);
DeleteObject(SelectObject(MayiDituDC,hMayiDitu));
DeleteObject(SelectObject(MayiDC,hMayi));
DeleteObject(SelectObject(MayiRectDC,hMayiRect));
DeleteDC(MayiDituDC);
DeleteDC(MayiDC);
DeleteDC(MayiRectDC);
DeleteDC(hDC);
ReleaseDC(hWnd,hDC);
#28
怎么看着create了5个,release和delete有7个啊
cpu在你核心线程得地方注意sleep,如果你这个线程做得事情比较少得话
cpu在你核心线程得地方注意sleep,如果你这个线程做得事情比较少得话
#29
SelectObject(MayiDituDC,hMayiDitu);
改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));
其它三个同样。
改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));
其它三个同样。
#30
为了怕gdi资源泄露 所以就多加了
#31
DeleteDC(hDC);
这个好像是多余的吧,如果你是用的GetDC
这个好像是多余的吧,如果你是用的GetDC
#32
我换了
HBITMAP OldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
出现以下错误
error C2440: '=' : cannot convert from 'HGDIOBJ' to 'HBITMAP'
#33
HGDIOBJ OldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
#34
29楼和33楼
改了gdi 资源还是不断增加
我以前都是直接用的
gdi 泄露该注意的地方,我都注意到了 还是不知道出现在什么地方
现在想要下一个DevpartnerStudio 9.0.2也就是BoundsChecker
这个需要10个资源分,等有了等下吧
改了gdi 资源还是不断增加
我以前都是直接用的
gdi 泄露该注意的地方,我都注意到了 还是不知道出现在什么地方
现在想要下一个DevpartnerStudio 9.0.2也就是BoundsChecker
这个需要10个资源分,等有了等下吧
#35
内存占用率渐渐升高,应该是不断申请内存但没有释放,前两天我写的程序也是这种现象,最后整个系统挂了,你仔细查查。
占用率高应该是某处有循环,或某些处理中涉及到大量的运算。
占用率高应该是某处有循环,或某些处理中涉及到大量的运算。
#36
内存泄露。
那个CPU占用率高的问题。
应该是算法不过关吧。
我这些在看一个围棋的程序。
没走一步棋要等好久。
我也没明白怎么回事呢。
那个CPU占用率高的问题。
应该是算法不过关吧。
我这些在看一个围棋的程序。
没走一步棋要等好久。
我也没明白怎么回事呢。
#37
C++程序运行时间越长,占用内存越多,最后导致程序不能运行
确定为gdi泄露 现贴上问题代码
而我在后面只
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
由于上面是一个循调用我只DeleteObject()
正确的应该为
for(i=0;i<rows*cols;i++)
{
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
}
这样就好了
这里要特别要谢谢韩卫平大哥 Loaden 等等 谢谢上面的所有的人
关于cpu占用率的问题我暂时还不知道用什么方法解决
确定为gdi泄露 现贴上问题代码
for(i=0;i<rows*cols;i++)
{
SelectObject(mdc,map[mapIndex[i]]);
rowNum=i/cols; //行数
colNum=i%cols; //列数
x=xstart+colNum*80;
y=ystart+rowNum*60;
//BitBlt(mdc,x,y,80,60,bufdc,0,0,SRCCOPY);
BitBlt(MayiDituDC,x,y,80,60,mdc,0,0,SRCAND);
BitBlt(MayiDituDC,x,y,80,60,mdc,0,0,SRCPAINT);
}
而我在后面只
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
由于上面是一个循调用我只DeleteObject()
正确的应该为
for(i=0;i<rows*cols;i++)
{
DeleteObject(SelectObject(mdc,map[mapIndex[i]]));
}
这样就好了
这里要特别要谢谢韩卫平大哥 Loaden 等等 谢谢上面的所有的人
关于cpu占用率的问题我暂时还不知道用什么方法解决
#38
gx
今天刚看到一个内存检测工具
Intel Parallel Inspector 是提供给 Microsoft Visual Studio* C/C++ 开发人员用于检测多线程错误的最方便的工具。与其它错误检查器不同,Parallel Inspector 能够最迅速全面地查明潜在的多线程与内存错误,以此来确保应用程序的稳定性。请使用Parallel Composer,Parallel Inspector 与 Parallel Amplifier 来创建优化的串行与并行应用程序。
今天刚看到一个内存检测工具
Intel Parallel Inspector 是提供给 Microsoft Visual Studio* C/C++ 开发人员用于检测多线程错误的最方便的工具。与其它错误检查器不同,Parallel Inspector 能够最迅速全面地查明潜在的多线程与内存错误,以此来确保应用程序的稳定性。请使用Parallel Composer,Parallel Inspector 与 Parallel Amplifier 来创建优化的串行与并行应用程序。
#39
#40
#41
路过~~~~~~