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

时间:2013-10-28 20:07:21

标签: c++ windows multithreading malloc free

我的VC ++程序中有一点我必须创建一个新线程并将lpParam作为int和string传递。所以到目前为止我所做的就是这个(擦除指针/错误检查):

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的调用意味着对free的调用。这里有两个mallocs,然后是两个frees。但是我收到了这条消息。

所以问题是为什么我不能释放那个字符串!提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

这里你要分配strlen(s)字节数,然后用strcpy写s + 1个字节,包括c字符串的空终止符。这可能会破坏内部堆结构并使任何后续malloc和free失败。