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