在 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 这可能会隐式声明 mallocint 结果。但是,在 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);
}