2013-10-28 68 views
1

我有一個點,在我的VC++程序中,我必須創建一個新的線程和傳遞爲lpParam一個int和一個字符串。所以我到目前爲止所做的就是這個(擦除指針/錯誤檢查):C++釋放內部指針指向結構作爲線程傳遞lpParam

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的調用意味着一個免費的調用。這裏有兩個malloc,然後兩個釋放。但是我得到這個消息。

所以問題是爲什麼我不能釋放該字符串!提前致謝。

+0

你應該改變你的規則。在C++中,使用'new'和'delete',而不是'malloc'和'free',除了與需要**的庫兼容。那麼你的下一個規則應該很少使用'new'和'delete'。 –

+0

隨Visual Studio一起提供的CRT使用預定義的模式在分配的內存(在Debug版本中)放置防護字節。當調用'free'時,CRT檢查這些保護字節是否仍然有它們的初始值。如果他們沒有收到您發佈的診斷信息。所以在你的情況下,你寫的超出了'param-> ip'指向的緩衝區的末尾(參見[typ1232](http://stackoverflow.com/a/19644325/1889329))。 – IInspectable

回答

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

這裏給您分配的strlen(一個或多個)字節的數量,但隨後寫S + 1個字節的strcpy包括C字符串的空終止。這可能會破壞內部堆結構並使任何以下malloc和自由失敗。