c ++ 11 — исключение malloc в c ++: недопустимое преобразование из «void *» в «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 в качестве выходного файла, но это не с ошибкой —

недопустимое преобразование из 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

Решение

В с 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);
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector