这可能是由于在 MFC 0f c++ 中我 运行 程序时堆错误的损坏

This may be due to a corruption of the heap error when i run program in MFC 0f c++

当我 运行 程序启动时,它会显示如图所示的错误。 enter image description here 当我点击继续时,它会显示如图所示的错误 enter image description here 这是我写的代码结构。

int nSites = 0;
int nTasks = 0;
int nThreads = 0;
CCriticalSection cs;
BOOL bUpdateList=false;

UINT VisitSite(LPVOID pParam){

    int nTask = 0;
    CInternetSession session;
    session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,5000);
    CHttpConnection *pConnection = NULL;
    CHttpFile *pFile1 = NULL;
    char *buffer = new char[10240];
    UINT nBytesRead = 0;
    while(nTasks>0){
    nTask = -1;
    cs.Lock();
    for(int t=0;t<nSites;t++){
        if(!bAssigned[t]){
            bAssigned[t]=true;
            nTask=t;
            t=nSites;
        }
    }
    cs.Unlock();

    if(nTask == -1){
        cs.Lock();
        nThreads--;
        cs.Unlock();
        return 0;
    }
    try
        {
            
            pConnection = session.GetHttpConnection(sAddress[nTask], 80, (_T("")), (_T("")));
            pFile1 = pConnection->OpenRequest((_T("GET")), (_T("/")));
            pFile1->SendRequest();
            nBytesRead = pFile1->Read(buffer, 10240);
            buffer[nBytesRead] = (_T('[=11=]'));
            //ถ้าหากว่า สามารถติดต่อได้ ที่ port 80จริง ให้พิมพ์ข้อความว่า IP Address น้ีเป็น Web server

            if (pConnection != NULL)
            {
                cs.Lock();
                bUpdateList=true;
                bIsWebServer[nTask]=true;
                cs.Unlock();
            }
            cs.Lock();
            bFinished[nTask]=true;
            nTasks--;
            nThreads--;
            cs.Unlock();

            if(pFile1) delete pFile1;
            if(pConnection) delete pConnection;
            delete [] buffer;

            if (buffer != NULL) {
                HeapFree(GetProcessHeap(), 0, buffer);
            }
            if (pFile1 != NULL) {
                HeapFree(GetProcessHeap(), 0, pFile1);
            }
            if (pConnection != NULL) {
                HeapFree(GetProcessHeap(), 0, pConnection);
            }

            //return 0;
        }
        catch (CInternetException* ie )
        {
                
                ie->Delete();
                cs.Lock();
                nTasks--;
                bUpdateList=true;
                bFinished[nTask]=true;
                bIsWebServer[nTask]=false;
                nThreads--;
                cs.Unlock();
        }

    }
    cs.Lock();
    nThreads--;
    cs.Unlock();
    session.Close();
    return 0;
}

因为我认为它来自 *ie 但不确定我是否正确编写了结构,请检查。

看看这个

        char *buffer = new char[10240];
        ...
        delete [] buffer;
        if (buffer != NULL) {
            HeapFree(GetProcessHeap(), 0, buffer);
        }

您不需要使用 delete[]HeapFree。因为您使用 new[] 来分配 buffer,所以您应该使用 delete[] 来释放它。删除对 HeapFree.

的调用

你和pFile1pConnection有同样的问题,使用delete不要使用HeapFree

另一个变化

        if(pFile1) delete pFile1;
        if(pConnection) delete pConnection;

可以简化为

        delete pFile1;
        delete pConnection;

删除NULL指针不是错误。删除NULL指针没有效果,所以删除前不需要检测指针是否为NULL

但是就像 Alan Birtles 所说的那样,您真的应该在尝试使用它之前测试 pConnection 是否为 NULL。