1

VC++ プログラムで、新しいスレッドを作成し、lpParam として int と string を渡す必要があるポイントがあります。これまでに行ったことは次のとおりです(ポインター/エラーチェックの消去):

typedef struct _chThParam {
    int c;
    char *s;
} chThParam;

DWORD WINAPI startSession(LPVOID lpParam){
    chThParam *param = (chThParam *)lpParam;
    //do something with param
    free(param->ip);
    free(param);
    return 0;
}

void handleResp(int c, char *s){
    chThParam *param;
    param = (chThParam *)malloc(sizeof(chThParam));
    param->c = c;
    param->s = (char *)malloc(strlen(s));
    strcpy(param->s, s);
    ::chTh = CreateThread(NULL, 0, startSession, param, 0, chThId);
}

競合はfree(param->ip);次のメッセージにあります。

Debug Error!
HEAP CORRUPTION DETECTED: after Normal block (#200) at 0x005BB908.
CRT detected that the application wrote to memory after end of heap buffer.

free(param);問題ありません。

私には次のようなルールがあります。malloc の呼び出しは、free の呼び出しを意味します。ここでは 2 つの malloc、次に 2 つの free です。しかし、私はこのメッセージを受け取ります。

問題は、なぜその文字列を解放できないのかということです! 前もって感謝します。

4

1 に答える 1

2
param->s = (char *)malloc(strlen(s));
strcpy(param->s, s);

ここでは、strlen(s) 個のバイトを割り当てていますが、c 文字列の null ターミネータを含む strcpy で s+1 バイトを書き込みます。これにより、内部ヒープ構造が破損し、以降の malloc および free が失敗する可能性があります。

于 2013-10-28T20:19:11.327 に答える