【问题标题】:RtlFreeHeap Invalid Address when freeing memory after passing pointer to external library method将指针传递给外部库方法后释放内存时的RtlFreeHeap地址无效
【发布时间】:2014-11-21 06:44:12
【问题描述】:

好吧,所以,这很奇怪。

我在 C 中使用 malloc 动态分配内存,然后调用在我链接的库中定义的方法。

我遇到的问题是调用该方法后内存无法释放,但如果我在调用该方法之前释放它就可以了。

代码:

unsigned char* pData = (unsigned char*)malloc(sizeof(unsigned char)*(sLen + 1));
pData[0] = CRITICAL_ERROR; // defined as 2
memcpy(pData+1, pBuf, sLen);
libwebsocket_write(pLws, pData, sLen + 1, LWS_WRITE_BINARY);
free(pData);

当我调用 free(pData) 时,会引发未处理的异常。

我已尝试针对与我的应用程序相同的操作系统、架构和构建配置(发布)编译该库,但没有成功。

编辑:我只是比较了libwebsocket_write调用前后的指针地址,结果是一样的。

【问题讨论】:

    标签: c pointers memory dynamic segments


    【解决方案1】:

    您可以查看documentation,其中指出:

    buf ,要发送的数据。对于在 websocket 连接上发送的数据(即不是默认的 http),此缓冲区必须在指针之前具有有效的 LWS_SEND_BUFFER_PRE_PADDING 字节,并且在 (buf + len) 之后的缓冲区中有效的附加 LWS_SEND_BUFFER_POST_PADDING 字节。这样就可以就地添加协议头和尾数据。

    您没有提供此填充。函数调用更改了保存分配缓冲区内部大小的指针之前的堆内存,然后释放失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2011-08-02
      • 1970-01-01
      • 2020-01-09
      相关资源
      最近更新 更多