我正在尝试通过在文档的帮助下创建小程序来学习libuv。请注意,我将通过c++
语言而不是c
使用它。这是我开始的 -
#include <iostream>
#include <uv.h>
int main() {
uv_loop_t *loop = malloc(sizeof(uv_loop_t));
uv_loop_init(loop);
std::cout << "Running loop" << std::endl;
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
free(loop);
return 0;
}
并使用 - g++ -std=c++14 -luv main.cpp
编译它,它应该将a.out
作为输出文件,但它会失败并显示错误 -
从'void *'无效转换为'uv_loop_t * {aka uv_loop_s *}
指向malloc用法。我通过用旧的libuv方法替换那些行来确认它 -
uv_loop_t* loop = uv_loop_new();
...
uv_loop_delete(loop);
这应该不起作用,但令人惊讶地工作并在这里编译好。
但我认为不是躲避这个问题,而是应该用c ++中的好方法解决这个问题。所以在这里我要求c ++中的一个很好的替代品(可能没有malloc /手动内存管理),所以我可以继续。
答案 0 :(得分:5)
在C a void*
中,返回类型malloc
,隐式转换为任何其他数据指针类型。
在C ++中它没有。
C也有隐式int
,这意味着使用malloc
的最佳做法在语言之间有所不同。在C中,不应该生成结果,因为如果缺少#include
,则可以隐式声明malloc
结果为int
。但是,在C ++中,如果结果被用作void*
以外的任何内容,则必须对结果进行投射。
您的代码
#include <iostream>
#include <uv.h>
int main() {
uv_loop_t *loop = malloc(sizeof(uv_loop_t));
uv_loop_init(loop);
std::cout << "Running loop" << std::endl;
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
free(loop);
return 0;
}
...更好地表达为
#include <iostream>
#include <uv.h>
int main() {
uv_loop_t loop;
uv_loop_init(&loop);
std::cout << "Running loop" << std::endl;
uv_run(&loop, UV_RUN_DEFAULT);
uv_loop_close(&loop);
}