1


を使用してスレッドに構造を渡そうとしてい CreateThread()ますが、これが私の構造です:

struct Secure
{
  int UID;
  LPVOID MainClass;
};

そして、これが私が呼び出す方法ですCreateThread()

Secure m_Secure = {Room->g_User[PlayerNumber].UID,this};

CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,&m_Secure,NULL,NULL);

最初のものは整数で、2番目のものは現在のクラスへのポインタです。
そして、ここに私のスレッドがあり、ここに問題があると思います

HRESULT WINAPI SecureThread(LPVOID Param)
{
    int UID = -1, UserNumber, i;

    Secure* m_Secure = (Secure*)Param;

    UID = m_Secure->UID;

    CGGCBotDlg *h_MainClass = (CGGCBotDlg*)m_Secure->MainClass;

    if (UID == -1) return 0;

    Sleep(25000);

    for (i = 0; i < TOTAL_CLIENTS; i++)
    {
        if (h_MainClass->Room->g_User[i].UID == UID)
        {
            UserNumber = i;
            break;
        }
    }

    if( h_MainClass->Room->g_User[UserNumber].IsFree == false && h_MainClass->Room->g_User[UserNumber].Secured == false)
        h_MainClass->Room->Kick(h_MainClass->Room->g_User[UserNumber].UID,"Didn't Authorized");

    return 0;
}

このスレッドが作成されるたびに、プログラムがクラッシュします。例外は次のとおりです。

First-chance exception at 0x00EC3548 in GGCRoomServer.exe: 0xC0000005: Access violation reading location 0x5D00009C.
Unhandled exception at 0x00EC3548 in GGCRoomServer.exe: 0xC0000005: Access violation reading location 0x5D00009C.
4

2 に答える 2

2

ここでローカル変数のアドレスをスレッドに渡しているようです

Secure m_Secure = {Room->g_User[PlayerNumber].UID,this};    
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,&m_Secure,NULL,NULL);

ローカル変数であるm_Secureため、スコープ外になり、関数の実行が終了した後に破棄されます。さらに、m_Secure がスタック上に作成される可能性があります。あるスレッドのスタック変数アドレスを別のスレッドに渡すことは、通常は悪い考えです。 ヒープ
上に変数を作成する必要があります。

CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,new Secure(...),NULL,NULL);
                                                            ^^^^^^^^^^^^^^

その後、ポインタを削除することを忘れないでください

于 2013-09-26T10:10:03.483 に答える