- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用示例代码来了解 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/
我正在尝试运行来自 https://github.com/aspnet/home 的示例 我遵循了 documentation 中的所有步骤但我无法让它发挥作用。 我正在运行 dnx 。 kestre
我真的很困惑 libev 和 libuv。 libuv 只是 POSIX 系统上 libev 的包装器吗? 如果不是,它的区别在哪里? 最佳答案 不再,因为 libuv-v0.9 Here is th
我想尝试在 dlang 中使用 libuv。我下载了这样的 dlang 绑定(bind): git clone git@github.com:tamediadigital/libuv.git 现在我接
我知道事件循环在单个进程(因此,在单个内核)上运行,但是我想知道从那里启动线程时会发生什么。 如果我使用uv_thread_create或uv_queue_work启动多个线程,它们是否可以在多个内核
我想知道需要采取什么预防措施,以便能够安全地从C++中的多个线程向libuv事件循环添加回调。 更多详细信息 我有一些多线程C++ 11代码,我想对其进行修改以使用libuv的网络通信API。我不想每
我正在 libuv 中初始化一个循环,但是如果我需要在初始化循环之后但在调用 uv_run 之前返回,如何正确清理所有内存和文件描述符?这是我的示例代码,loop 为 uv_loop_t*,serve
如果我有这个功能,你会如何在字节码虚拟机中使用libuv void vm_run(vm_t* vm); 它启动虚拟机来执行代码,只要用户的代码这样做,它就会继续运行,现在我想在VM语言中添加异步内容,
要求:UDP 服务器在接收到 UDP 数据包后,将接收到的数据包存储到两个队列之一。每个队列都关联一个工作线程,关联的线程从队列前端拾取数据包,对其进行处理并将其写入内存缓存系统。 约束:解决方案必须
当我尝试发送一些基本的 UDP 消息时,它看起来好像没有发送。我尝试运行我在网上找到的几个示例。我正在使用 SocketTest v3.0.0 来测试服务器/客户端。当我测试 TCP 发送时,一切都按
uv_write 的文档指出 [ 1 ]: Note The memory pointed to by the buffers must remain valid until the callback
我正在使用 libsourcey,它使用 libuv 作为其底层 I/O 网络层。一切都已设置并且似乎正在运行(因为我只是在制作原型(prototype)和试验,所以还没有测试任何东西)。但是,我要求
我正在尝试为 C++ 库编写 nodejs 绑定(bind),但我似乎遇到了障碍。 我正在尝试使对 C++ 库的所有调用都是异步的,这就是我使用 libuv 的原因。我基本上是在关注 this教程。
在 libuv 中,您最终可能会因过多的工作或错误代码而占用工作线程。是否有一个简单的函数可以检查工作线程或线程队列的健康状况?它不必是 100% 确定性的,毕竟不可能确定工作线程是卡在慢速代码上还是
server 将在调用 start 后在新线程中启动(服务器有自己的循环)。问题是程序立即结束,因为默认循环中没有注册事件。我想要的是通过 uv_default_loop 模拟 pthread_joi
我正在尝试找出如何修复我在使用 Valgrind 运行此程序时遇到的这些内存泄漏。泄漏发生在 nShell_client_main 中的两个分配。但我不是确定如何正确释放它们。 我已经尝试在 nShe
我正在使用 libuv。我读过 http://nikhilm.github.com/uvbook/processes.html并且仍然无法弄清楚如何捕获子进程的标准输出,以便它在父进程中可用(但不能代
我有一个使用 libuv 库的应用程序。它运行默认循环: uv_run(uv_default_loop()); 应用出现故障时如何优雅退出?目前我正在按照以下示例进行操作: uv_tcp_t* tcp
我正在评估 libuv 作为我正在编写的 C/c++ 服务器的库。该协议(protocol)以长度为前缀,所以一旦我可以从流中读取一个 32 位整数,我就应该能够知道我应该分配多大的缓冲区。文档说 u
例如我有 2 个线程 .我要从主线程(线程 1)停止服务器。 线程1:主程序 线程 2:TcpServer 来自 libuv 库: /* * This function will stop the
我正在尝试运行与 LWS 库一起安装的“libwebsockets-test-server”,但它无法运行,因为“lwsts[31616]: libuv 支持未编译”。 我已经检查过是否安装了 lib
我是一名优秀的程序员,十分优秀!