首页 > 解决方案 > 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[] ???;
}

一旦不再需要它,释放该内存的预期方法是什么?

标签: c++node.jslibuv

解决方案


由于libuv是 ac 库,它的结构应该是标准布局类型。因此,您可以将uv_write_tand包装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);
}

这是因为指向标准布局对象的第一个非静态数据成员的指针可以与指向该对象的指针相互转换。


推荐阅读