【问题标题】:libuv and uv_buf_init: who should free what?libuv 和 uv_buf_init:谁应该释放什么?
【发布时间】:2016-06-28 16:20:53
【问题描述】:

考虑 libuv 的官方 documentation其他实用程序部分)。
这是uv_buf_init的声明:

uv_buf_t uv_buf_init(char* base, unsigned int len)

文档指出(强调我的):

uv_buf_t 的构造函数。

由于平台差异,用户不能依赖 uv_buf_t 结构的 base 和 len 成员的顺序。 uv_buf_t 完成后用户负责释放基地。按值传递的返回结构。

在我看来,base 可以在调用 uv_buf_init 后立即被释放。

另一方面,uv_buf_t 结构 is documented 由两个字段组成:base,类型为 char *len,类型为 size_t

我不清楚的是:

  • 数据是否复制到缓冲区中? (好吧,我想答案是否定的,因为这会在性能方面造成很大的损失)。

  • 我应该在调用uv_try_write 或其他*_write 函数后释放数据吗?也就是说,一旦数据确实被实际消费了。

【问题讨论】:

  • 你应该使用 valgrind 来检查,如果文档不够,也可以阅读源代码。此外,实际存储位置的平台差异对我来说似乎无关紧要。
  • @self 阅读源代码,是的:文档不足(确实很糟糕)。

标签: c libuv


【解决方案1】:

不要担心struct,但要担心它指向什么。

如果您将uv_buf_t 传递给的函数以异步方式使用,则uv_buf_t.base 指向的内存在调用回调之前必须被释放。

即使取消像 uv_write_t 这样的正在进行的请求(通过在句柄上调用 close)也不会阻止回调被调用,因此在那里进行清理是安全的。

【讨论】:

    【解决方案2】:

    数据不会复制到uv_buf_tuv_buf_t.base 指的是您用于创建它的相同字符数组。
    因此,您没有性能损失,而且您不能在调用 uv_buf_init 后立即删除数据。
    相反,您可以在使用缓冲区后释放它们,即(例如)当您将其提交给uv_writeuv_try_write 时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多