Mengembalikan void pointer unik dari suatu fungsi

11

Untuk mendapatkan void *dari fungsi di CI akan melakukan sesuatu seperti ini (contoh sangat mendasar):

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

Bagaimana cara mencapai hasil yang sama saat menggunakan std::unique_ptr<>?

ZeppRock
sumber
1
Tolong jelaskan masalah apa yang Anda alami dengan melakukannya.
molbdnilo
1
Lihat jawaban ini untuk void unique_ptr umum: stackoverflow.com/a/39288979/2527795
vll
Harap dicatat bahwa seharusnya hampir tidak pernah ada alasan untuk menggunakan mallocC ++ seperti ini. Anda mengembalikan pointer ke memori mentah, yang Anda butuhkan untuk menempatkan objek-objek baru sebelum Anda diizinkan menggunakannya. Jika Anda tidak memiliki alasan yang baik untuk membuat objek di lain waktu daripada saat Anda mengalokasikan memori, maka Anda harus menggunakan newatau std::make_uniqueyang akan mengalokasikan memori, serta membuat objek yang sesuai. Dalam kedua kasus std::vectordengan reserveprob. lebih baik juga. Bahkan jika Anda tidak menggunakan ini, operator newadalah cara idiomatis mengalokasikan memori, bukan malloc.
kenari

Jawaban:

18

Anda perlu menentukan deleter khusus agar dapat digunakan voidsebagai unique_ptrargumen tipe seperti itu:

#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());
}
Segar segar
sumber
2

Penyederhanaan jawaban @ RealFresh menggunakan std::freelangsung sebagai deleter alih-alih membangun functor:

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

Lihat komentar saya pada pertanyaan.

kenari
sumber
1

Pertimbangkan untuk mengembalikan pointer ke char-array:

#include <memory>

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