Я пытаюсь изучить 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 / ручного управления памятью), чтобы я мог продолжить.
В с 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);
}
Других решений пока нет …