एक समारोह से एक अद्वितीय शून्य सूचक लौटना


11

void *CI में एक समारोह से प्राप्त करने के लिए कुछ इस तरह से किया जाएगा (बहुत मूल उदाहरण):

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

उपयोग करते समय मैं एक ही परिणाम कैसे प्राप्त कर सकता हूं std::unique_ptr<>?



1
कृपया बताएं कि आपको इसे करने में क्या समस्या है।
मोल्बडिलो

1
: सामान्य शून्य unique_ptr के लिए इस उत्तर देखें stackoverflow.com/a/39288979/2527795
VLL

कृपया ध्यान दें कि mallocइस तरह सी ++ में उपयोग करने का लगभग कभी भी कारण नहीं होना चाहिए । आप कच्ची मेमोरी में एक पॉइंटर लौटा रहे हैं, जिसे उपयोग करने की अनुमति देने से पहले आपको नई-नई वस्तुओं को लगाने की आवश्यकता है। यदि आपके पास बाद में समय पर ऑब्जेक्ट बनाने के लिए एक अच्छा कारण नहीं है जब आप मेमोरी आवंटित कर रहे हैं, तो आपको उपयोग करना चाहिए newया std::make_uniqueजो मेमोरी आवंटित करेगा, साथ ही उपयुक्त ऑब्जेक्ट भी बनाएगा। या तो मामले में std::vectorसाथ reserveहै। बेहतर भी है। यहां तक ​​कि अगर आप इन का उपयोग नहीं करते हैं, operator newतो स्मृति को आवंटित करने का मुहावरेदार तरीका है, नहीं malloc
अखरोट

जवाबों:


18

आपको इस प्रकार के तर्क के 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

फंतासी के std::freeनिर्माण के बजाय सीधे deleter के रूप में उपयोग करके RealFresh के उत्तर का सरलीकरण :

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

सवाल पर मेरी टिप्पणी देखें, हालांकि।


1

इसके बजाय चार-सरणी के लिए एक सूचक लौटने पर विचार करें:

#include <memory>

std::unique_ptr<char[]> get_ptr(std::size_t size)
{
    return std::make_unique<char[]>(size);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.