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,然後兩個釋放。但是我得到這個消息。
所以問題是爲什麼我不能釋放該字符串!提前致謝。
你應該改變你的規則。在C++中,使用'new'和'delete',而不是'malloc'和'free',除了與需要**的庫兼容。那麼你的下一個規則應該很少使用'new'和'delete'。 –
隨Visual Studio一起提供的CRT使用預定義的模式在分配的內存(在Debug版本中)放置防護字節。當調用'free'時,CRT檢查這些保護字節是否仍然有它們的初始值。如果他們沒有收到您發佈的診斷信息。所以在你的情況下,你寫的超出了'param-> ip'指向的緩衝區的末尾(參見[typ1232](http://stackoverflow.com/a/19644325/1889329))。 – IInspectable