落ちるぞぉ〜?orz

こんなコードを書いたのはいいのですが落ちてしまいます。


// この関数からスタート
int CHoge::MyCreateThread(HWND hWnd)
{
    SStartupParam sParam = { hWnd, this }
    _beginthreadex(&ThreadStartFunc, &sParam); // 引数の順番忘れた。(ぉ


    return 0;
}

unsigned CHoe::ThreadStartFunc(void* pVoid)
{
    SStartupParam* psParam = reinterpret_cast<SStartupParam*>(pVoid);

    // ごにょごにょ
    // でもココで落ちる
    psParam->m_pcThis->HogeFunc(psParam->hWnd); 

    _endthreadex(0);
    return 0;
}

なんでだ〜…?? と、ちょっと悩んだんですが、冷静になってみれば落ちるのは当たり前ですねコレ。

_beginthreadex() したとしても、その瞬間からスレッドが動くわけない -> 親スレッドがある程度動いてから子スレッドに制御が移る -> 親スレッドが MyCreateThread() を抜けた後に、子スレッドが走る可能性が十分に考えられる -> sParam は破棄されているわけだから pVoid は不正なアドレスを指す orz

夜中に10分ぐらい悩んでしまったッス。