libuv和uv_buf_init:谁应该释放什么?

时间:2016-06-28 16:20:53

标签: c libuv

考虑 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后立即释放。{/ p>

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

我不清楚的是:

  • 数据是否已复制到缓冲区? (好吧,我猜答案是否定的,因为在表现方面会是一个很大的惩罚)。

  • 在完成对uv_try_write或其他*_write功能的调用后,我是否应该释放数据?也就是说,一旦确实实际消费了数据。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

不要担心struct,但要担心它指向的内容。

如果以{1}}传递的函数以异步方式使用,则uv_buf_t指向的内存必须,直到调用回调为止。

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