2013-10-28 125 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和自由失败。