0

だから私はヒープの問題の破損を抱えており、それがいくつかのアレイでの作業方法に関係しているのではないかと考えました。実際、ある時点で、このようなメッセージがWinProcに送信されました。

SendMessage(hwnd, LOG_ADD, NULL, (LPARAM)L"Initializing winsock... ");

LOG_ADDは104として定義されています。WinProc内で、msg == LOG_ADDの場合、次のようになります。

case LOG_ADD:
            {
                pGame->pMessageLog->PutToLog((WCHAR*)lParam);
                pGame->pD2DResources->OnRender(pGame->pMessageLog);

MessageLog :: PutToLog(WCHAR [])があります:

void MessageLog::PutToLog(WCHAR txt[])
{
    int strLen=wcslen(txt);
    int logLen=wcslen(logHistory);

    WCHAR* pWCHAR = txt;

    int x=0;

    // Counts the number of '\n' into wString and adds that number to nLogLines
    for(x=0; x<strLen; x++)
    {
        if(pWCHAR[x]=='\n')
            nLogLines++;
    }

    pWCHAR = logHistory;

    x=0;
    while(nLogLines>5)
    {
        if(pWCHAR[x]=='\n')
            nLogLines--;
        x++;
    }

    if(x!=0)
    {
        for(int y=0; y<logLen-x; y++)
        {
            pWCHAR[y]=pWCHAR[y+x];
        }
    }

    wcscat (logHistory, txt);
}

これは破損の問題を説明できますか?実際、SendMessage(hwnd、LOG_ADD ...)のすべての行を削除すると、数行後にコンパイラが「struct hostent * host;」の行を実行しても、破損は表示されません。または「if((host = gethostbyname(server))== NULL)」。

4

1 に答える 1

2

あなたはコメントで尋ねました:

これは、WCHAR配列をLPARAMとして送信し、それを別の関数に送信して使用する適切な方法ですか?

確かに、コールサイトで何を渡すかを知っていて、それを実際にウィンドウプロシージャにあるタイプとして扱う(キャストする)ことを確認する限り、これはまったく問題ありません。

アクセス時に無効である可能性のあるメモリへのポインタを適切に処理していることを確認してください。たとえば、メッセージを送信する代わりに投稿し、受信者がメッセージを処理する前にスコープを使い果たしたメモリへのポインタを渡す場合です。

また、送信するデータを適切に初期化することを忘れないでください...

于 2013-03-19T01:01:28.033 に答える