考虑 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
功能的调用后,我是否应该释放数据?也就是说,一旦确实实际消费了数据。
答案 0 :(得分:0)
数据不会复制到uv_buf_t
,uv_buf_t.base
指的是您用来创建数据的相同字符数组。
因此,您没有性能损失,但在调用uv_buf_init
后也无法立即删除数据。
相反,您可以在使用缓冲区后释放它们,即(例如)将其提交到uv_write
或uv_try_write
时。
答案 1 :(得分:0)
不要担心struct
,但要担心它指向的内容。
如果以{1}}传递的函数以异步方式使用,则uv_buf_t
指向的内存必须不,直到调用回调为止。
即使取消正在进行的请求,例如uv_buf_t.base
(通过在句柄上调用close)也不会阻止回调被调用,因此在那里进行清理是安全的。