2016-10-08 5 views
1

Я пытаюсь изучить libuv, создавая небольшие программы с помощью его документации. Обратите внимание, что я буду использовать его через c++ язык, а не c. Вот то, что я начал с -избегая malloc в C++: неверное преобразование из 'void *' в 'uv_loop_t *

#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 в качестве выходного файла, но он терпит неудачу с ошибкой -

недействительных преобразование из «недействительным *» до ' uv_loop_t * {aka uv_loop_s *}

который указывает на использование malloc. Я подтвердил его, заменив эти строки со старым libuv способ сделать это -

uv_loop_t* loop = uv_loop_new(); 
... 
uv_loop_delete(loop); 

, которые не должны работать, но на удивление работает и компилирует прекрасно здесь.

Но я думаю, вместо того, чтобы уклоняться от этой проблемы, я должен решить это с хорошим способом в C++. Поэтому здесь я прошу о хорошей альтернативе в C++ (возможно, без управления malloc/manual memory), поэтому я могу продолжить.

+4

Возможный дубликат [недопустимого преобразования из \ 'аннулируются \ * 'в \' символ \ *' при использовании таНос?] (http://stackoverflow.com/questions/5099669/invalid- convert-from-void-to-char-when-use-malloc) – LogicStuff

+0

@LogicStuff Я пытаюсь избежать malloc здесь, не пытаясь его использовать, поэтому извините за любые неудобства. –

+0

Зачем использовать динамическую память? Почему бы не просто 'uv_loop_t loop; uv_loop_init (&loop); '? – melpomene

ответ

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

& hellip; лучше выражен как

#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); 
} 
Смежные вопросы