การคืนค่าตัวชี้โมฆะที่ไม่ซ้ำใครจากฟังก์ชั่น


11

ในการรับvoid *ฟังก์ชั่นใน CI จะทำสิ่งนี้ (ตัวอย่างพื้นฐานมาก):

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

ฉันจะได้ผลลัพธ์เดียวกันเมื่อใช้งานได้std::unique_ptr<>อย่างไร



1
โปรดอธิบายว่าคุณกำลังทำอะไรอยู่
molbdnilo

1
ดูคำตอบนี้สำหรับโมฆะทั่วไป unique_ptr: stackoverflow.com/a/39288979/2527795
vll

โปรดทราบว่าไม่ควรมีเหตุผลที่จะใช้mallocใน C ++ เช่นนี้ คุณกำลังส่งคืนพอยน์เตอร์ไปยังหน่วยความจำแบบดิบโดยคุณต้องวางออบเจกต์ใหม่ลงในก่อนที่คุณจะได้รับอนุญาตให้ใช้งาน หากคุณไม่มีเหตุผลที่ดีในการสร้างวัตถุในภายหลังมากกว่าเมื่อคุณจัดสรรหน่วยความจำคุณควรใช้newหรือstd::make_uniqueจะจัดสรรหน่วยความจำรวมถึงสร้างวัตถุที่เหมาะสม ในทั้งสองกรณีที่std::vectorมีreserveปัญหา ดีขึ้นด้วย แม้ว่าคุณจะไม่ได้ใช้เหล่านี้เป็นวิธีที่สำนวนการจัดสรรหน่วยความจำไม่ได้operator new malloc
วอลนัท

คำตอบ:


18

คุณต้องระบุ deleter ที่กำหนดเองเพื่อใช้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

ความเรียบง่ายของคำตอบของ @ RealFresh ใช้std::freeโดยตรงเป็น deleter แทนที่จะสร้าง functor:

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

ดูความคิดเห็นของฉันในคำถาม


1

ลองส่งคืนพอยน์เตอร์ไปที่ char-array แทน:

#include <memory>

std::unique_ptr<char[]> get_ptr(std::size_t size)
{
    return std::make_unique<char[]>(size);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.