【问题标题】:avoiding malloc in c++ : invalid conversion from ‘void*’ to ‘uv_loop_t*避免 c++ 中的 malloc:从“void*”到“uv_loop_t*”的无效转换
【发布时间】:2017-02-17 10:50:14
【问题描述】:

我正在尝试通过借助它的文档创建小程序来学习 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/手动内存管理),以便我可以进一步进行。

【问题讨论】:

  • @LogicStuff 我在这里尽量避免使用 malloc,而不是尝试使用它,如有不便,敬请原谅。
  • 为什么要使用动态内存?为什么不只是uv_loop_t loop; uv_loop_init(&amp;loop);
  • 在c++中你应该使用new
  • @EdHeal 好吧,我应该使用 unique_ptr 但我不确定它是否不会炸毁我的系统。 /jk 我不知道怎么用。

标签: c++ c++11 pointers smart-pointers libuv


【解决方案1】:

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

在 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);
}

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2011-07-03
    • 2016-03-21
    • 2017-06-30
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多