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

257
24 октября 2017, 02:42

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

std::unique_ptr<char[], decltype(&free)> information(malloc(arr_size),&free);

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

error: no matching function for call to ‘std::unique_ptr<char [], void (*)(void*) throw ()>::unique_ptr(void*, void (*)(void*) throw ())’
std::unique_ptr<char[], decltype(&free)>information(malloc(arr_size),&free);

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

Answer 1

Начиная с C++17 соответствующие конструкторы std::unique_ptr являются шаблонными

template<class U> explicit unique_ptr( U p ) noexcept;
template<class U> 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 *, что не соответствует ни одному из этих условий. Именно поэтому компилятор сообщает вам, что в данном случае нет подходящей функции для вызова.

В С++11 соответствующие конструкторы были нешаблонными и принимали первый параметр типа std::unique_ptr<>::pointer, т.е. в вашем случае char *. Эти функции не будут вызываемыми и в С++11 по той причине, что результат malloc типа void * не может быть неявно приведен к типу char *.

Если же явно привести первый аргумент к char *, то код должен скомпилироваться

std::unique_ptr<char [], decltype(&free)> information((char *) malloc(arr_size), &free);
Answer 2

Сделайте явное преобразование в нужный тип любым удобным образом:

std::unique_ptr<char[], decltype(&free)> information ((char*)malloc(arr_size), free);
READ ALSO
Ввод/Вывод __float128 C++

Ввод/Вывод __float128 C++

Подскажите как в C++ вводить __float128, потом вывести без знаков после точки

370
Несколько init-expression в for

Несколько init-expression в for

В синтаксисе for

205
Ошибка при подключении файла

Ошибка при подключении файла

Добрый деньПытаюсь решить одну задачу, надо, чтобы читались данные из файла

358