程序运行的时候没问题,运行了N小时后,出现提示:
程序无法获取所需的资源。
然后程序跳出。这一般是指什么资源? 由于程序不操作,挂那边N小时也会出现这问题, 加上我程序中有一个一直刷新时间的CString 类型变量,间隔是1秒一次ontime.开始怀疑是CString 的问题(前几天看到一篇置顶的文章,说CString有缺陷)。结果,我做了一实验,发现申请10万个CString都不成问题。
void CTestbugDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int i;
for(i=0;i<=100000;i++)
{
CString mmm;
mmm.Format("TEST");
}
::MessageBox(NULL,"Test","Test",0);
}这下迷茫了,问题仍旧存在。 大约3,4小时就会出现,根据机器不同,略有长短。
解决问题的 500分, 给予提示的50分, up也有分。非常非常非常非常非常非常非常非常 感谢!!!!!
程序无法获取所需的资源。
然后程序跳出。这一般是指什么资源? 由于程序不操作,挂那边N小时也会出现这问题, 加上我程序中有一个一直刷新时间的CString 类型变量,间隔是1秒一次ontime.开始怀疑是CString 的问题(前几天看到一篇置顶的文章,说CString有缺陷)。结果,我做了一实验,发现申请10万个CString都不成问题。
void CTestbugDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int i;
for(i=0;i<=100000;i++)
{
CString mmm;
mmm.Format("TEST");
}
::MessageBox(NULL,"Test","Test",0);
}这下迷茫了,问题仍旧存在。 大约3,4小时就会出现,根据机器不同,略有长短。
解决问题的 500分, 给予提示的50分, up也有分。非常非常非常非常非常非常非常非常 感谢!!!!!
解决方案 »
- directshow新手~捕捉到dota游戏精彩画面时,如何存储视频~希望获得一个对视频简单处理的框架
- vs2008下的mfc的comm控件
- md5 的源码
- 自己重写CBitmap,遇到内存泄露问题!!!!!!
- 关于打印运行过程中 对话框界面上所有能看到的东西(打印界面)
- pjf基于活动进程链的Win2000下进程隐藏--如何修改在XP。
- 怎样才能录取指定程序播放的声音?
- 难道这里没有高手吗?这么简单的问题大家只说简单,却没有一个人做。高分相送!!
- 200分求救!关于打印对齐,我百思不得其解!
- 为什么第二次调用CToolBar::LoadToolBar(ID)时失败
- 寻求解决思路,很累了。
- ODBC中CRecordSet中有没有可以得到某个字段的最大最小值的函数
{
CString mmm; //不太好吧。
mmm.Format("TEST");
}
::MessageBox(NULL,"Test","Test",0);
{
CString mmm;
mmm.Format("TEST");
}
::MessageBox(NULL,"Test","Test",0);
这部分是没有问题的,检查别的部分吧。而且资源不足一般都是dc的原因,比如没有释放,还有选入以后没有选出。
to JennyVenus(),是啊,我觉得像这样改一下,保管不到一万次就死,呵呵
for(i=0;i<=3;i++)
{
CString plmm;
plmm.Format("TEST");
}
::MessageBox(NULL,"Test","Test",0);
解決方法:
打開任務管理器
逐一屏蔽OnTimer中的功能,
如程式仍上你所述問題,一般來說內存占有率會不斷增加(程式開始運行約半分鐘后趨于穩定. 當然你可以等4小時看它是不是死掉,你有時間的話:P)
當你發現屏蔽掉一個功能后不再有內存占有升高的問題時,就能確定出在哪里了.
不要再懷疑CString的那段代碼.
资源和内存是不一样的,但资源泄露本质上也是一类内存,资源可以理解成是“被操作系统管理的内存块”(基本内存是C++编译器管理的)举个例子,光标,在不同的程序中使用的鼠标大体是相同的,如果不做优化的话,那每个程序的exe 文件里都至少得包含一个箭头光标资源四个resize 光标资源...
在程序运行时,每个进程又得加载这些相同的数据到内存中,但是20年前的电脑却只有64 K内存,所以Windows 规定类似的数据必须由操作系统直接管理
于是,箭头光标在内存内只有一个,这就是“资源”的目的加载资源是宣称要使用该资源,释放资源是宣称不再使用该资源
如果你宣称要使用某个资源后再也没宣称不再使用,操作系统将永远把这个资源保留在内存中!这就是资源泄露资源除了光标外,主要包含图标、位图、窗体等,其它还包括文件、进程等
而现在在其它的应用程序中还可以把它推广到连接会话,如套接字、数据库连接另外在2000下当一个进程的资源总数达到一万个时,操作系统将不再为该进程分配资源(C语言中基本内存亦称堆)
(资源亦称句柄)
1.资源,检查位图、光标、图标的加载,看看是不是每个都释放了
2.GDI(绘图代码),Font、Pen等的Create也要DeleteObject
3.其它,就不太好说了像CWnd::Create 成功后,不是用SendMessage(WM_CLOSE),也会有HWND泄露
尽量避免这种情况。
结果,我做了一实验,发现申请10万个CString都不成问题。 int i;
for(i=0;i<=100000;i++)
{
CString mmm;
mmm.Format("TEST"); //这里其实只是分配一个CString,再怎么说MFC的bug,我都不相信会导致资源泄漏,因为mmm的作用域是在循环内,出了循环就无效了,不信,在下面一句引用mmm试试。
}
::MessageBox(NULL,"Test","Test",0);
}如果改成:
CString *pmmm = new CString("Test");
你试试。
void CXXXX:Ontime()
{
CString mmm;
mmm.Format("TEST");
}
看有没有问题。
{
CString mmm;
mmm.Format("TEST");
}象这样的测试,我想如果可能试无穷次也不会出现问题的吧?
________________
是资源的问题,比如DC,PEN,BRUSH之类,没有释放。
和内存没有关系。
void CTestbugDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int i;
CString mmm;
for(i=0;i<=100000;i++)
{
mmm.Format("TEST[%d]",i);
}
::MessageBox(NULL,"Test","Test",0);
}
10万条cstring占不了多少内存,理论上32位的 CPU可以使用2的32次方的数据空间,只要你的硬盘有2的32次方的空间。所以可能不全是内存分配的原因,可能系统在数量上有限的资源,如:比如DC,PEN,BRUSH之类用了没有释放
我以前编写扫雷的时候就出现过类似的问题,开始正常运行,
运行五六分钟后,显示方面就出现问题,无法正常显示,
系统在同一时刻最多有五个CDC类的资源,
如果用过之后没有释放就会出现问题。
我的确有CDC资源申请后没有deleteobject的情况存在。
可是这东西,在出了区域之后之后,还会记录着?譬如,我ondraw里用了几个cpen, 会头ondraw总要出去啊,还需要deleteobject?
我用的cpen又不是new出来的, 直接CPen penpenpen.的。有什么办法,验证的确是CDC资源问题呢?
贴出代码。