C++ C++;释放作为线程lpParam传递的结构指针内的指针

C++ C++;释放作为线程lpParam传递的结构指针内的指针,c++,windows,multithreading,malloc,free,C++,Windows,Multithreading,Malloc,Free,在我的VC++程序中,我必须创建一个新线程,并作为lpParam传递一个int和一个字符串。到目前为止,我所做的是(擦除指针/错误检查): 冲突处于自由状态(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 buff

在我的VC++程序中,我必须创建一个新线程,并作为lpParam传递一个int和一个字符串。到目前为止,我所做的是(擦除指针/错误检查):

冲突处于
自由状态(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(参数)没有问题

我有一条规则:打电话给malloc意味着打电话给free。这里是两个马洛克,然后是两个自由。但是我得到了这个信息

所以问题是为什么我不能释放那根绳子!提前谢谢

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

在这里,您将分配strlen(s)个字节量,但随后使用strcpy写入s+1个字节,包括c字符串的空终止符。这可能会损坏内部堆结构,并导致以下任何malloc和free失败。

您应该更改规则。在C++中,使用与代码库兼容的代码,< <代码> > <代码> >代码>删除< /COD>和决不<代码> Malc C < /C> >和<代码>免费< /代码>。然后,您的下一个规则应该是很少使用
new
delete
。VisualStudio附带的CRT以预定义的模式在分配的内存(调试构建中)周围放置保护字节。调用
free
时,CRT检查这些保护字节是否仍有其初始值。如果他们没有,你就会收到你发布的诊断信息。因此,在您的例子中,您在
param->ip
(请参阅)所指向的缓冲区末尾之外进行了写入。
param->s = (char *)malloc(strlen(s));
strcpy(param->s, s);