首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将参数发送到alloc_cb

将参数发送到alloc_cb
EN

Stack Overflow用户
提问于 2018-02-14 21:17:33
回答 2查看 120关注 0票数 0

我想使用libuv通过TCP发送文件。我的问题是用于读取文件内容的uv_read_start

在此之后,我必须让malloc(size)分配必要的内存量来填充内存中的所有文件(我绝对希望将这样的文件放在内存中)。

有没有办法在没有全局变量的情况下做到这一点?也许是一种完全不同的方式来做同样的事情?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-02-17 00:39:04

我看到handle->data包含一个void*,所以我们可以准确地放入我们想要的内容。在调用uv_read_start之前,将大小存储在流句柄stream->data = (size_t*)malloc(sizeof(size_t));*(size_t *)(stream->data) = size;中,并通过读取size_t rsize = *(size_t*)(handle->data);alloc_cb中重用它。在此之后,您必须释放此缓冲区。

还有其他想法吗?

票数 0
EN

Stack Overflow用户

发布于 2018-04-13 18:38:56

正如OP所提到的,使用void *字段是一种选择。

另一种是在C中使用继承(如果使用C++)或继承风格的黑客。

C++的:我们使用继承的

代码语言:javascript
运行
复制
struct my_struct: public uv_handle_t {
    size_t size;
};

您可以将指向此结构的指针传递给alloc_cb (因为my_struct继承自handle),然后将其转换回my_struct类型

代码语言:javascript
运行
复制
my_struct * s = reinterpret_cast<my_struct*>(handle);

C :的:我们没有继承,所以我们需要一点修改:

代码语言:javascript
运行
复制
struct my_struct {
    uv_handle_t handle;
    size_t size;
};

然后,在将指向my_struct类型的对象的指针强制转换为uv_handle_t ((uv_handle_t*) s)后调用alloc_cb,并在alloc_cb内部强制转换回my_struct

代码语言:javascript
运行
复制
my_struct * s = (my_struct*) handle;

An introduction to libuv,release 2这本书的第8.4段“将数据传递给工作线程”(参见here)中,对C方法进行了更详细的解释(尽管在不同的上下文中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48788195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档