c++ - libuv - 空闲的写缓冲区
问题描述
uv_write
状态 [ 1 ]的文档:
注意缓冲区指向的内存必须保持有效,直到回调被调用。这也适用于 uv_write2()。
因此,缓冲区的基础可能需要动态分配。调用函数可能如下所示:
void write_to_stream(uv_stream_t* stream) {
uv_write_t* write_req = new uv_write_t;
uv_buf_t buf{};
buf.base = new char[1024];
buf.len = 1024;
// fill the buffer
uv_write(write_req, stream, buf, 1, on_write);
}
在这种情况下,分配的内存new char[1024]
需要在on_write
触发回调之前有效。
查看回调的签名,void on_write(uv_write_t* req, int status)
不清楚如何释放此内存,因为似乎无法从回调中访问此指针。
void on_write(uv_write_t* req, int status) {
// how to find the memory allocated for req's buffer?
delete[] ???;
}
一旦不再需要它,释放该内存的预期方法是什么?
解决方案
由于libuv
是 ac 库,它的结构应该是标准布局类型。因此,您可以将uv_write_t
and包装uv_buf_t
在上下文结构中,然后再转换回上下文结构。请参见以下示例:
struct write_context_t {
uv_write_t write_req;
uv_buf_t buf;
~write_context_t() {
delete[] buf.base;
}
}
void on_write(uv_write_t* req, int status) {
write_context_t* context = reinterpret_cast<write_context_t*>(req);
/* Do stuff ... */
delete context;
}
void write_to_stream(uv_stream_t* stream) {
write_context_t* write_req = new write_context_t;
/* fill your write_req and buf info here ... */
// initiate write
uv_write(&write_req.write_req, stream, write_req.buf, 1, on_write);
}
这是因为指向标准布局对象的第一个非静态数据成员的指针可以与指向该对象的指针相互转换。
推荐阅读
- php - str_ireplace 没有按预期工作
- function - 重启后Powershell功能不起作用?
- opengl - 在 pyBullet 中模拟失真的相机
- pdf - 使用 Ghostscript 将扫描的 PDF 转换为纯文本
- python - 重复的查询行
- jenkins - 如何使用其 API 在 Jenkins 中获取构建历史记录?
- python - Python selenium 在模态中找不到元素
- java - 字符串返回值上的 compareTo java 方法
- azure-ad-b2c - B2C 自定义内容 - 将声明值输出为隐藏字段
- python - Tweepy twitter bot 如何防止在一段时间内重复推文