Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Как использовать free в качестве deleter'а?

#cpp


У меня есть примерно такой код:

std::unique_ptr information(malloc(arr_size),&free);


Но компилятор кидает исключение:

error: no matching function for call to ‘std::unique_ptr::unique_ptr(void*, void (*)(void*) throw ())’
std::unique_ptrinformation(malloc(arr_size),&free);


Скажите, пожалуйста, почему происходит эта ошибка, и как её исправить?
    


Ответы

Ответ 1



В С++11 соответствующие конструкторы принимали первый параметр типа std::unique_ptr<>::pointer. В вашем случае это char *. Эти конструкторы не будут вызываемыми и в С++11 по той причине, что в С++ результат malloc типа void * не может быть неявно приведен к типу char *. Начиная с C++17 спецификация несколько поменялась, но суть осталась той же. Соответствующие конструкторы std::unique_ptr являются шаблонными template explicit unique_ptr( U p ) noexcept; template unique_ptr( U p, /* ... */ d ) noexcept; но согласно http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr, эти конструкторы участвуют в overload resolution только в том случае, если выполняется одно из условий Тип U совпадает с std::unique_ptr<>::pointer Тип U - это std::nullptr_t (еще одно условие, котрое не относится к делу) В вашем случае std::unique_ptr<>::pointer - это char *, а U будет дедуцировано как void *, что не соответствует ни одному из этих условий. Именно поэтому компилятор сообщает вам, что в данном случае нет подходящей функции для вызова. Если же явно привести первый аргумент к char *, то код должен скомпилироваться std::unique_ptr information((char *) malloc(arr_size), &free);

Ответ 2



Сделайте явное преобразование в нужный тип любым удобным образом: std::unique_ptr information ((char*)malloc(arr_size), free);

Комментариев нет:

Отправить комментарий