gpt4 book ai didi

c - 令人困惑的行为,malloc 和 free(),以及 libuv

转载 作者:行者123 更新时间:2023-11-30 14:20:12 26 4
gpt4 key购买 nike

使用示例代码来了解 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() ,要么库中存在一个错误,即它如何确定传入数据所需的大小,并且在使用更长的字符串后,我得到了垃圾作为太大内存块的一部分。如果是这样的话,那么它是我之前输入的片段这一事实只是偶然的。这是可能的原因,还是我错过了什么?还有其他信息吗。我应该包括哪些内容来澄清它?

最佳答案

malloc() 的实现会有所不同,但可以安全地假设对 malloc() 的调用可以返回指向先前 free() 释放的内存块的指针,并且返回的内存不会被清零。换句话说,malloc() 为我们提供一个指向包含先前初始化数据的数据的指针是完全正常的。

也就是说,我怀疑这里的根本问题是一个未终止的字符串,这可能是您序列化字符串的方式造成的。例如,如果您只是从客户端写入 strlen(str) 字节,则不会写入 NULL。因此,当服务器收到消息时,它将有一个未终止的字符串。如果这就是您计划传递字符串的方式,并且您计划将其视为正常的以 null 结尾的字符串,则服务器需要将数据复制到足够大的缓冲区中,以容纳该字符串以及附加的 NULL 字符。

那么为什么您会看到过去消息的片段呢?可能是运气不好。如果这是一个非常简单的应用程序,则 malloc() 很可能返回与先前请求重叠的一 block 内存。

那么为什么我会得到如此干净的输出,我不应该看到大量的乱码数据,或者字符串操作的段错误走向无穷大吗?再次,运气不好。请记住,当内核第一次为您的应用程序提供一页内存时,它将首先将页面清零(这是出于安全原因而这样做)。因此,即使您可能没有终止字符串,字符串所在的堆内存页面可能处于相对原始的清零状态。

关于c - 令人困惑的行为,malloc 和 free(),以及 libuv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com