一个propertypage上面,三个页面A、B、C。A上面,实现对硬盘上的文件进行某种扫描,用线程实现,扫描结果的文件路径列在listbox中,有按钮可以控制开始、暂停、结束。在扫描结果的listbox中,可以通过右键菜单运行某个外挂程序(比如记事本),是用CreateProcess建立的单独的进程。在C页面中,专门做了对这种外挂程序的控制,即列表中列出可运行的外挂,有按钮控制运行、结束。现在有这样一个问题:在A中,暂停扫描状态下,右键菜单中运行了外挂程序后(比如记事本),然后再关掉外挂程序,再继续扫描,这个过程可进行一次或多次,最后点击“结束扫描”,扫描结束后会报错,信息是:Debug Assertion Failed!
出错的地方是winstr.cpp的57行。
另外,如果是开始扫描后,先停止扫描,然后运行外挂程序,再结束它,没有问题,但是如果再开始、结束扫描,又会报上面那个错误。如果在A界面暂停扫描、运行程序,然后在C界面结束它,再回到A界面继续扫描、停止扫描,就没有问题。很是郁闷。是不是新建立的进程与原来的线程什么的发生冲突呢???

解决方案 »

  1.   

    刚刚试了release版本,一开始似乎没有问题,但是试几次后就出现内存泄漏问题了,似乎是反应比较慢似的
      

  2.   

    出错的地方是winstr.cpp的57行:
    #ifndef _AFXDLL
    int AFXAPI AfxLoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf)
    {
    ASSERT(AfxIsValidAddress(lpszBuf, nMaxBuf*sizeof(TCHAR)));
    #ifdef _DEBUG
    // LoadString without annoying warning from the Debug kernel if the
    //  segment containing the string is not present
    if (::FindResource(AfxGetResourceHandle(),
       MAKEINTRESOURCE((nID>>4)+1), RT_STRING) == NULL)
    {
    lpszBuf[0] = '\0';
    return 0; // not found
    }
    #endif //_DEBUG这里AfxIsValidAddress没有通过。说明当前lpszBuf指向的内存区无效。可能原因是:
    1.未分配
    2.某次操作中越界,导致gap标志被毁,仔细检查代码中有没有buf overflow的情况,重点检查下列操作:
      strcpy, memcpy,strcat
      CString::Format() 变量个数与格式字符串不匹配。  http://blog.aarony.net
      

  3.   

    ASSERT(AfxIsValidAddress(lpszBuf, nMaxBuf*sizeof(TCHAR)));
    说明内存地址无效!