在 C++ 中避免 malloc:从‘void*’到‘uv_loop_t* 的无效转换
avoiding malloc in c++ : invalid conversion from ‘void*’ to ‘uv_loop_t*
我正在尝试通过在其文档的帮助下创建小程序来学习 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
作为输出文件,但它失败并出现错误 -
invalid conversion from ‘void*’ to ‘uv_loop_t* {aka uv_loop_s*}
这是指向 malloc 用法。我通过用旧的 libuv 方式替换这些行来确认它 -
uv_loop_t* loop = uv_loop_new();
...
uv_loop_delete(loop);
这应该行不通,但令人惊讶的是,在这里可以正常编译。
但我认为与其回避这个问题,不如用c++的好方法来解决这个问题。所以在这里我要求在 c++ 中找到一个好的替代方案(可能没有 malloc/manual 内存管理),以便我可以进一步进行。
在 C a void*
中,malloc
的 return 类型隐式转换为任何其他数据指针类型。
在 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);
}
我正在尝试通过在其文档的帮助下创建小程序来学习 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
作为输出文件,但它失败并出现错误 -
invalid conversion from ‘void*’ to ‘uv_loop_t* {aka uv_loop_s*}
这是指向 malloc 用法。我通过用旧的 libuv 方式替换这些行来确认它 -
uv_loop_t* loop = uv_loop_new();
...
uv_loop_delete(loop);
这应该行不通,但令人惊讶的是,在这里可以正常编译。
但我认为与其回避这个问题,不如用c++的好方法来解决这个问题。所以在这里我要求在 c++ 中找到一个好的替代方案(可能没有 malloc/manual 内存管理),以便我可以进一步进行。
在 C a void*
中,malloc
的 return 类型隐式转换为任何其他数据指针类型。
在 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);
}