避免c ++中的malloc:从'void*'到'uv_loop_t*的无效转换

hg_*_*git 1 c++ pointers smart-pointers c++11 libuv

我正在尝试通过在其文档的帮助下创建小程序来学习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;
}
Run Code Online (Sandbox Code Playgroud)

并编译它 - 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);
Run Code Online (Sandbox Code Playgroud)

这不应该工作,但令人惊讶的是工作和编译在这里很好.

但我认为不是躲避这个问题,而是应该用c ++中的好方法解决这个问题.所以在这里我要求c ++中的一个很好的替代品(可能没有malloc /手动内存管理),所以我可以继续前进.

Che*_*Alf 5

在C a中void*,返回类型malloc,隐式转换为任何其他数据指针类型.

在C++中它没有.

C也有隐含int,这意味着使用的最佳实践malloc在语言之间有所不同.在C的结果不应该被铸造的,因为如果一个人缺少#include这可能隐含宣布mallocint结果.但是,在C++中,如果将结果用作除a以外的任何内容,则必须对其进行转换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;
}
Run Code Online (Sandbox Code Playgroud)

......更好地表达为

#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);
}
Run Code Online (Sandbox Code Playgroud)