Bir işlevden benzersiz bir geçersiz işaretçi döndürme


11

void *CI bir fonksiyondan bir almak için böyle bir şey yapardı (çok temel örnek):

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

Kullanırken aynı sonucu nasıl elde edebilirim std::unique_ptr<>?



1
Lütfen bunu yaparken hangi sorunu yaşadığınızı açıklayın.
molbdnilo

1
Jenerik void unique_ptr için bu cevaba bakın: stackoverflow.com/a/39288979/2527795
vll

mallocC ++ 'da böyle bir kullanım için neredeyse hiçbir neden olmamalıdır . İşaretçiyi ham belleğe döndürüyorsunuz, yeni nesneleri kullanmanıza izin verilmeden önce yerleştirmeniz gerekiyor. Nesneleri bellek ayırmaktan daha geç bir zamanda oluşturmak için iyi bir nedeniniz yoksa, uygun nesneleri oluşturmanın yanı sıra bellek ayıracak newveya kullanacak olanları da kullanmalısınız std::make_unique. Her iki durumda da std::vectorsahip reserveprob. daha iyi. Bunları kullanmasanız bile, operator newbellek ayırmanın deyimsel yolu değil malloc.
Ceviz

Yanıtlar:


18

Bunun tür bağımsız değişkeni voidolarak kullanmak için özel silme belirtmeniz gerekir 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

@ RealFresh'in cevabını std::free, bir işlev oluşturucu yerine doğrudan silici olarak kullanarak basitleştirmesi :

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

Yine de soru hakkındaki yorumuma bakın.


1

Bunun yerine bir işaretçiyi char-array'e döndürmeyi düşünün:

#include <memory>

std::unique_ptr<char[]> get_ptr(std::size_t size)
{
    return std::make_unique<char[]>(size);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.