Возврат уникального указателя void из функции - PullRequest
11 голосов
/ 16 января 2020

Чтобы получить void * из функции в C, я бы сделал что-то вроде этого (очень простой пример c):

void *get_ptr(size_t size)
{
    void *ptr = malloc(size);
    return ptr;
}

Как добиться того же результата при использовании std::unique_ptr<> * * 1006

Ответы [ 3 ]

18 голосов
/ 16 января 2020

Вам необходимо указать пользовательское средство удаления, чтобы использовать void в качестве аргумента типа unique_ptr, например:

#include <memory>
#include <cstdlib>

struct deleter {
    void operator()(void *data) const noexcept {
        std::free(data);
    }
};

std::unique_ptr<void, deleter> get_ptr(std::size_t size) {
    return std::unique_ptr<void, deleter>(std::malloc(size));
}

#include <cstdio>
int main() {
    const auto p = get_ptr(1024);
    std::printf("%p\n", p.get());
}
2 голосов
/ 16 января 2020

Упрощение ответа @ RealFre sh с использованием std::free непосредственно в качестве средства удаления вместо создания функтора:

auto get_ptr(std::size_t size) {
    return std::unique_ptr<void, decltype(&std::free)>(std::malloc(size), std::free);
}

Впрочем, см. Мой комментарий к вопросу.

1 голос
/ 16 января 2020

Вместо этого рассмотрите возможность возврата указателя на массив символов:

#include <memory>

std::unique_ptr<char[]> get_ptr(std::size_t size)
{
    return std::make_unique<char[]>(size);
}
...