程序运行的时候没问题,运行了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也有分。非常非常非常非常非常非常非常非常  感谢!!!!!

解决方案 »

  1.   

    maoxianwang,恭喜你拿星了。应该贴出来,不然很难看的出问题。。
      

  2.   

    for(i=0;i<=3;i++)
    {
    CString mmm;        //不太好吧。
    mmm.Format("TEST");
    }
    ::MessageBox(NULL,"Test","Test",0);
      

  3.   

    CString不太可能,你查一下CDC之类的有没有释放
      

  4.   

    KcSoft(蓝珍珠精灵):多谢了呀我太菜了,近两个月才拿星,呵你看看我的postuserid便知,实际上就是一只freshman2000年来csdn,唉多了我就不说了,好好学习,争取5月底升两星你也加油啊
      

  5.   

    for(i=0;i<=100000;i++)
    {
    CString mmm;
    mmm.Format("TEST");
    }
    ::MessageBox(NULL,"Test","Test",0);
    这部分是没有问题的,检查别的部分吧。而且资源不足一般都是dc的原因,比如没有释放,还有选入以后没有选出。
      

  6.   

    用boundschecker查一下是哪里地资源没有释放
      

  7.   

    是不是CPU风扇的问题  :-)))))
      

  8.   

    to maoxianwang(大大㊣BETAⅡ我想赶快结婚那样就可以)兄,恭喜发财!
    to JennyVenus(),是啊,我觉得像这样改一下,保管不到一万次就死,呵呵
    for(i=0;i<=3;i++)
    {
        CString plmm;
        plmm.Format("TEST");
    }
    ::MessageBox(NULL,"Test","Test",0);
      

  9.   

    Panr(光荣) : 有银子大家赚,同喜啊另:为啥不到一万就死呢?
      

  10.   

    碰過類似問題.
    解決方法:
    打開任務管理器
    逐一屏蔽OnTimer中的功能,
    如程式仍上你所述問題,一般來說內存占有率會不斷增加(程式開始運行約半分鐘后趨于穩定. 當然你可以等4小時看它是不是死掉,你有時間的話:P)
    當你發現屏蔽掉一個功能后不再有內存占有升高的問題時,就能確定出在哪里了.
    不要再懷疑CString的那段代碼.
      

  11.   

    我们知道一般的new/delete 是基本内存操作,如果你new了却没delete,就有内存泄露了
    资源和内存是不一样的,但资源泄露本质上也是一类内存,资源可以理解成是“被操作系统管理的内存块”(基本内存是C++编译器管理的)举个例子,光标,在不同的程序中使用的鼠标大体是相同的,如果不做优化的话,那每个程序的exe 文件里都至少得包含一个箭头光标资源四个resize 光标资源...
    在程序运行时,每个进程又得加载这些相同的数据到内存中,但是20年前的电脑却只有64 K内存,所以Windows 规定类似的数据必须由操作系统直接管理
    于是,箭头光标在内存内只有一个,这就是“资源”的目的加载资源是宣称要使用该资源,释放资源是宣称不再使用该资源
    如果你宣称要使用某个资源后再也没宣称不再使用,操作系统将永远把这个资源保留在内存中!这就是资源泄露资源除了光标外,主要包含图标、位图、窗体等,其它还包括文件、进程等
    而现在在其它的应用程序中还可以把它推广到连接会话,如套接字、数据库连接另外在2000下当一个进程的资源总数达到一万个时,操作系统将不再为该进程分配资源(C语言中基本内存亦称堆)
    (资源亦称句柄)
      

  12.   

    资源主要包括
    1.资源,检查位图、光标、图标的加载,看看是不是每个都释放了
    2.GDI(绘图代码),Font、Pen等的Create也要DeleteObject
    3.其它,就不太好说了像CWnd::Create 成功后,不是用SendMessage(WM_CLOSE),也会有HWND泄露
      

  13.   

    一定要注意内存的释放,最好到WIN98下测试,98要求的严格一些。检查一下是否有数组被外部调用
    尽量避免这种情况。
      

  14.   

    因为没有见到代码,倒是不好说程序的问题。倒是对你的测试有点想法:
    结果,我做了一实验,发现申请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");
    你试试。
      

  15.   

    试一下单纯如此
    void CXXXX:Ontime()
    {
       CString mmm;
       mmm.Format("TEST");
    }
    看有没有问题。
      

  16.   

    for(i=0;i<=100000;i++)
    {
    CString mmm;
    mmm.Format("TEST");
    }象这样的测试,我想如果可能试无穷次也不会出现问题的吧?
      

  17.   

    程序无法获取所需的资源。
    ________________
    是资源的问题,比如DC,PEN,BRUSH之类,没有释放。
    和内存没有关系。
      

  18.   

    你这样改写试一下:
    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);
    }
      

  19.   

    同意everandforever(Forever)
    10万条cstring占不了多少内存,理论上32位的 CPU可以使用2的32次方的数据空间,只要你的硬盘有2的32次方的空间。所以可能不全是内存分配的原因,可能系统在数量上有限的资源,如:比如DC,PEN,BRUSH之类用了没有释放
      

  20.   

    同意 tonyzym(tony) 的观点,有可能是CDC类派生的资源没有释放。
    我以前编写扫雷的时候就出现过类似的问题,开始正常运行,
    运行五六分钟后,显示方面就出现问题,无法正常显示,
    系统在同一时刻最多有五个CDC类的资源,
    如果用过之后没有释放就会出现问题。
      

  21.   

    那如何验证的确是CDC资源没有释放呢?
    我的确有CDC资源申请后没有deleteobject的情况存在。
    可是这东西,在出了区域之后之后,还会记录着?譬如,我ondraw里用了几个cpen, 会头ondraw总要出去啊,还需要deleteobject?
    我用的cpen又不是new出来的, 直接CPen penpenpen.的。有什么办法,验证的确是CDC资源问题呢?
      

  22.   

    一般open,都要相应close。若是在ondraw下的pDC不用释放,因CDC *pDC为个类,退出时会自动调用它自己的~函数(忘了名字,即和构造函数相反的)。
    贴出代码。
      

  23.   

    这个代码怎么贴啊? 我都不知道是哪里错。 再说,那么大个东西,ondraw又不是3,4个地方。。ondraw里面也不是 1,2十行。  几百行贴出来。。 我都不好意思让大家看。。
      

  24.   

    OnTimer中不能有耗时间太长的操作.你只有1秒,很可能时间长了遇上你在其中的操作耗时过长,这样就导致出错.因为下一个OnTimer又来了.再说了Timer是有限的资源.