libuv - 自由写入缓冲区
libuv - free write buffer
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
是一个 c 库,因此其结构应该是标准布局类型。因此,您可以将uv_write_t
和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);
}
这是因为指向标准布局对象的第一个非静态数据成员的指针可与指向该对象的指针相互转换。
另一种方法是使用data
. 请注意,所有 uv 手柄都包含一个data
字段,可以根据自己的需要使用它。
void write_to_stream(uv_stream_t* stream) {
uv_write_t* write_req = new uv_write_t;
write_req.data = new char[1024];
uv_buf_t buf{};
buf.base = write_req.data;
buf.len = 1024;
// fill the buffer
uv_write(write_req, stream, buf, 1, on_write);
}
void on_write(uv_write_t* req, int status) {
delete[] req.data;
delete req;
}
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- 将自由函数绑定为类成员函数
- 静态数组的自由动态数组
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- libuv - 自由写入缓冲区
- USRSCTP发送缓冲区无法自由