【发布时间】:2013-03-29 21:27:47
【问题描述】:
使用示例代码了解 libuv 我遇到了一个我不确定的副作用。该代码使用 malloc() 获取内存以存储来自网络上的客户端的数据,然后将相同的数据发送回,只是回显。然后它使用 free 释放内存。这通过回调循环一遍又一遍地重复。获取内存的代码行是:
uv_write_t *req = (uv_write_t *) malloc(sizeof(uv_write_t));
释放内存的行是:
free((char*) req->data);
free(req);
但是,如果您输入一个长字符串,例如“Whats the word on the street?”要回显,然后放入较短的字符串,例如旧字符串的“Hi”片段,在较短的字符串回显后将重新出现。例如输出可以是这样的:
街上的词是什么? 你好 你好 你好 你好 他在街上的话?
由于内存被释放,我不确定为什么旧片段会重新出现。我对这个主题的想法是,要么我对 malloc 和 free() 有一些我不了解的地方,要么在库中存在一个错误,它决定了传入数据所需的大小以及在使用更长的字符串后我得到了垃圾作为太大的内存块的一部分。如果是这样的话,那么它是我之前输入的一个片段的事实只是偶然的。这是可能的原因,还是我错过了什么?有没有其他信息。我应该包括澄清吗?
【问题讨论】:
-
您是否正确设置了
req->data?我看到你释放它但从不分配它。 -
Nitpick:不要在 C 中强制转换 malloc()。测试用例怎么样?我们无法看到当前真正发生的事情。
-
@RandyHoward 实际上,在
void *在 C 中合法之前,您必须强制转换以避免警告,所以这可能是更精通旧 C 的人。 -
已经很久了。现在是 2013 年。这不仅是个坏主意,还会隐藏错误。
-
我们需要看看你是如何设置
req->data的,目前我们没有足够的代码来回答你的问题。