在c ++中避免使用malloc:从'void *'到'uv_loop_t *

时间:2016-10-08 15:31:03

标签: c++ c++11 pointers smart-pointers 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;
}

并使用 - 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 /手动内存管理),所以我可以继续。

1 个答案:

答案 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);
}