C++程序运行时间越长,占用内存越多,最后导致程序不能运行

时间:2022-12-25 08:09:04
关于这个问题

关于这个程序:
1.是一个游戏程序。一只蚂蚁在特定区域运动。键盘控制运动方向。
2.创建画图备DC 在每一步我都DeleteDC(),我想这个已经处理好了
3.程序涉及到全局指针,这个不会处理
4.CPU占用率高,这个不知道怎么解决,也不知道什么原因CPU占用率高
 这个可能是根KeyEvent有关
 KeyEvent(GameEngine::GetGameEngine()->GetWindow()); //处理键盘消息

我的问题
一。C++程序运行时间越长,占用内存越多,最后导致程序不能运行?是什么原因引起的,怎么根踪或调试?
二。CPU占用率高,这个不知道怎么解决?不知道分析是否正确解决。有没有其它的好方法?



最后

就只有100分了,天气冷了,请大家注意加衣服。谢谢大家了。
    

.

42 个解决方案

#1


可能的情况:new了东西没有注意delete……

#2


任务管理器看看gdi资源占用多少 。。

用内存检测工具看看那里内存泄露了

#3


第一肯定是内存泄露了
第二你可以在debug下什么都不干,暂停程序看看程序暂停在哪里,多试几次

#4


引用 1 楼 mstlq 的回复:
可能的情况:new了东西没有注意delete……


g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


就只看到这个new 不过是没有看到delete
怎么delete呀

#5


可能是有的地方申请了内存没有释放了吧
内存占用太高,可能你的程序运算量太大,内存的申请与释放太快了

#6


引用 4 楼 tan625747 的回复:
引用 1 楼 mstlq 的回复:
 可能的情况:new了东西没有注意delete……


 g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
  IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


 就只看到这个new 不过是没有看到delete
 怎么delete呀

不需要GameEngine对象的时候就写
delete GameEngine呗……

不过楼主的问题应该不是出在这里吧?
正常设计下,这个new应该只会执行了一次(单件模式)……

#7


对呀,我想问题不是出现在这里

#8


引用 6 楼 mstlq 的回复:
引用 4 楼 tan625747 的回复:
引用 1 楼 mstlq 的回复:
可能的情况:new了东西没有注意delete……


g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


就只看到这个new 不过是没有看到delete
怎么delete呀



不需要GameEngine对象的时候就写
delete GameEngine呗……

不过楼主的问题应该不是出在这里吧?
正常设计下,这个new应该只会执行了一次(单件模式)……

恩,一般只执行一次的, 没必要delete.虽然delete一下更好。
应该是gdi 资源泄露吧

#9


引用 8 楼 pady_pady 的回复:
引用 6 楼 mstlq 的回复:
 引用 4 楼 tan625747 的回复:
 引用 1 楼 mstlq 的回复:
 可能的情况:new了东西没有注意delete……


 g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
 IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


 就只看到这个new 不过是没有看到delete
 怎么delete呀


 不需要GameEngine对象的时候就写
 delete GameEngine呗……

 不过楼主的问题应该不是出在这里吧?
 正常设计下,这个new应该只会执行了一次(单件模式)……

 恩,一般只执行一次的, 没必要delete.虽然delete一下更好。
 应该是gdi 资源泄露吧


恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

#10


贴点看看

#11


找个内存泄露查找工具检查一下不就完了吗?
BoundsChecker

#12


引用 9 楼 tan625747 的回复:
 恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
只能看代码找了

#13


引用 12 楼 akirya 的回复:
引用 9 楼 tan625747 的回复:

  恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

 任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
 只能看代码找了



谢谢你们呀,我刚才看了,就是gdi资源不断的增加

呵,这个在代码中找太麻烦了吧

#14


引用 13 楼 tan625747 的回复:
引用 12 楼 akirya 的回复:
引用 9 楼 tan625747 的回复:

  恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
只能看代码找了




谢谢你们呀,我刚才看了,就是gdi资源不断的增加

呵,这个在代码中找太麻烦了吧


用BoundsChecker可以检查gdi资源泄露的。

#15


和C++无关的好吧! 你的代码有问题。

#16


引用 14 楼 loaden 的回复:
引用 13 楼 tan625747 的回复:
 引用 12 楼 akirya 的回复:
 引用 9 楼 tan625747 的回复:

   恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

 任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
 只能看代码找了


 谢谢你们呀,我刚才看了,就是gdi资源不断的增加

 呵,这个在代码中找太麻烦了吧


用BoundsChecker可以检查gdi资源泄露的。


我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀

#17


我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀
++++++++++++++++++
你有最新的key吗?

#18


估计是gdi资源频繁分配,删除的问题,全局指针new的地方看看是否需要删除的也得删除。
cpu很高看哪有循环,或者是你的这个检测key的事件得放在线程中运行,才不会导致主线程cpu过高。

#19


这应该与运行环境无关吧,应该是内存分配和释放没有搭配好

#20


可能是你用的一些函数,比如一些C函数,内部的实现是用molloc来申请的,然后返回指针,而用的时候没有free

#21


友情顶贴。

#22


内存泄漏呗……

#23


先检查你的内存申请和释放的是否是一一对应的。、
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();


现在贴上关键代码,帮我看一下


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,如果你这个线程做得事情比较少得话

#29


SelectObject(MayiDituDC,hMayiDitu);
改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));

其它三个同样。

#30


引用 28 楼 aizibion 的回复:
怎么看着create了5个,release和delete有7个啊

 cpu在你核心线程得地方注意sleep,如果你这个线程做得事情比较少得话


为了怕gdi资源泄露 所以就多加了

#31


DeleteDC(hDC);
这个好像是多余的吧,如果你是用的GetDC

#32


引用 29 楼 pady_pady 的回复:
SelectObject(MayiDituDC,hMayiDitu);
 改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
 后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));

 其它三个同样。

我换了
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个资源分,等有了等下吧

#35


内存占用率渐渐升高,应该是不断申请内存但没有释放,前两天我写的程序也是这种现象,最后整个系统挂了,你仔细查查。
占用率高应该是某处有循环,或某些处理中涉及到大量的运算。

#36


内存泄露。
那个CPU占用率高的问题。
应该是算法不过关吧。
我这些在看一个围棋的程序。
没走一步棋要等好久。
我也没明白怎么回事呢。

#37


C++程序运行时间越长,占用内存越多,最后导致程序不能运行 

确定为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 来创建优化的串行与并行应用程序。

#39


该回复于2010-05-18 09:17:32被版主删除

#40


该回复于2010-05-12 17:18:08被版主删除

#41


路过~~~~~~

#42


该回复于2010-06-18 15:26:30被版主删除

#1


可能的情况:new了东西没有注意delete……

#2


任务管理器看看gdi资源占用多少 。。

用内存检测工具看看那里内存泄露了

#3


第一肯定是内存泄露了
第二你可以在debug下什么都不干,暂停程序看看程序暂停在哪里,多试几次

#4


引用 1 楼 mstlq 的回复:
可能的情况:new了东西没有注意delete……


g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


就只看到这个new 不过是没有看到delete
怎么delete呀

#5


可能是有的地方申请了内存没有释放了吧
内存占用太高,可能你的程序运算量太大,内存的申请与释放太快了

#6


引用 4 楼 tan625747 的回复:
引用 1 楼 mstlq 的回复:
 可能的情况:new了东西没有注意delete……


 g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
  IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


 就只看到这个new 不过是没有看到delete
 怎么delete呀

不需要GameEngine对象的时候就写
delete GameEngine呗……

不过楼主的问题应该不是出在这里吧?
正常设计下,这个new应该只会执行了一次(单件模式)……

#7


对呀,我想问题不是出现在这里

#8


引用 6 楼 mstlq 的回复:
引用 4 楼 tan625747 的回复:
引用 1 楼 mstlq 的回复:
可能的情况:new了东西没有注意delete……


g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


就只看到这个new 不过是没有看到delete
怎么delete呀



不需要GameEngine对象的时候就写
delete GameEngine呗……

不过楼主的问题应该不是出在这里吧?
正常设计下,这个new应该只会执行了一次(单件模式)……

恩,一般只执行一次的, 没必要delete.虽然delete一下更好。
应该是gdi 资源泄露吧

#9


引用 8 楼 pady_pady 的回复:
引用 6 楼 mstlq 的回复:
 引用 4 楼 tan625747 的回复:
 引用 1 楼 mstlq 的回复:
 可能的情况:new了东西没有注意delete……


 g_pGE=new GameEngine(hInstance,TEXT("GameStart"),TEXT("GameStart"),
 IDI_BIGICON,IDI_SMALLICON,FALSE,32,800,600);


 就只看到这个new 不过是没有看到delete
 怎么delete呀


 不需要GameEngine对象的时候就写
 delete GameEngine呗……

 不过楼主的问题应该不是出在这里吧?
 正常设计下,这个new应该只会执行了一次(单件模式)……

 恩,一般只执行一次的, 没必要delete.虽然delete一下更好。
 应该是gdi 资源泄露吧


恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

#10


贴点看看

#11


找个内存泄露查找工具检查一下不就完了吗?
BoundsChecker

#12


引用 9 楼 tan625747 的回复:
 恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
只能看代码找了

#13


引用 12 楼 akirya 的回复:
引用 9 楼 tan625747 的回复:

  恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

 任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
 只能看代码找了



谢谢你们呀,我刚才看了,就是gdi资源不断的增加

呵,这个在代码中找太麻烦了吧

#14


引用 13 楼 tan625747 的回复:
引用 12 楼 akirya 的回复:
引用 9 楼 tan625747 的回复:

  恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
只能看代码找了




谢谢你们呀,我刚才看了,就是gdi资源不断的增加

呵,这个在代码中找太麻烦了吧


用BoundsChecker可以检查gdi资源泄露的。

#15


和C++无关的好吧! 你的代码有问题。

#16


引用 14 楼 loaden 的回复:
引用 13 楼 tan625747 的回复:
 引用 12 楼 akirya 的回复:
 引用 9 楼 tan625747 的回复:

   恩这个可能性较大,我想也是的,但问题是怎么看,出现在哪 些代码,怎么找?

 任务管理器看看gdi资源 正常不正常,要是一直增加就肯定是你写的错误。
 只能看代码找了


 谢谢你们呀,我刚才看了,就是gdi资源不断的增加

 呵,这个在代码中找太麻烦了吧


用BoundsChecker可以检查gdi资源泄露的。


我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀

#17


我用的是VS2008 我刚才下了一个BoundsChecker,但不知道怎么用呀
++++++++++++++++++
你有最新的key吗?

#18


估计是gdi资源频繁分配,删除的问题,全局指针new的地方看看是否需要删除的也得删除。
cpu很高看哪有循环,或者是你的这个检测key的事件得放在线程中运行,才不会导致主线程cpu过高。

#19


这应该与运行环境无关吧,应该是内存分配和释放没有搭配好

#20


可能是你用的一些函数,比如一些C函数,内部的实现是用molloc来申请的,然后返回指针,而用的时候没有free

#21


友情顶贴。

#22


内存泄漏呗……

#23


先检查你的内存申请和释放的是否是一一对应的。、
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();


现在贴上关键代码,帮我看一下


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,如果你这个线程做得事情比较少得话

#29


SelectObject(MayiDituDC,hMayiDitu);
改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));

其它三个同样。

#30


引用 28 楼 aizibion 的回复:
怎么看着create了5个,release和delete有7个啊

 cpu在你核心线程得地方注意sleep,如果你这个线程做得事情比较少得话


为了怕gdi资源泄露 所以就多加了

#31


DeleteDC(hDC);
这个好像是多余的吧,如果你是用的GetDC

#32


引用 29 楼 pady_pady 的回复:
SelectObject(MayiDituDC,hMayiDitu);
 改为oldMayiMap = SelectObject(MayiDituDC,hMayiDitu);
 后面DeleteObject(SelectObject(MayiDituDC,oldMyyiMap));

 其它三个同样。

我换了
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个资源分,等有了等下吧

#35


内存占用率渐渐升高,应该是不断申请内存但没有释放,前两天我写的程序也是这种现象,最后整个系统挂了,你仔细查查。
占用率高应该是某处有循环,或某些处理中涉及到大量的运算。

#36


内存泄露。
那个CPU占用率高的问题。
应该是算法不过关吧。
我这些在看一个围棋的程序。
没走一步棋要等好久。
我也没明白怎么回事呢。

#37


C++程序运行时间越长,占用内存越多,最后导致程序不能运行 

确定为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 来创建优化的串行与并行应用程序。

#39


该回复于2010-05-18 09:17:32被版主删除

#40


该回复于2010-05-12 17:18:08被版主删除

#41


路过~~~~~~

#42


该回复于2010-06-18 15:26:30被版主删除