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

标签 c++ windows multithreading malloc free

我在我的 VC++ 程序中有一个要点,我必须创建一个新线程并将一个 int 和一个字符串作为 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 的调用意味着对 free 的调用。这里有两个 malloc,然后是两个 free。但是我收到了这条消息。

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

最佳答案

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

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

关于C++释放指向作为线程lpParam传递的结构的指针内部的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19644125/

相关文章:

c++ - name = null 时的 getsockname 行为

c++ - 为什么以及如何从接口(interface)定义语言 (IDL) 生成头文件

c++ - Windows 线程 sleep 并从另一个线程唤醒

multithreading - 并发消息处理设计争议

java - 自定义 SMTPAppender 中的 scheduleAtFixedRate 不会延迟

c++ - 使用 bcp 获取可构建的 Boost 提取

c++ - 为什么我不能直接调用通过成员指针访问的实例的方法

windows - 在 Windows R 中设置主目录

java - 从 Java 中生成的文件路径在 Android 中创建的 File 对象上的 file.getName() 产生奇怪的结果

java - 在 ReentrantReadWriteLock 中是否有 WriteLock 优先于 ReadLock