একটি ফাংশন থেকে একটি অনন্য শূন্য পয়েন্টার ফিরে


11

void *সিআই-এর কোনও ক্রিয়াকলাপ থেকে সন্ধান পেতে এরকম কিছু করা হবে (খুব মৌলিক উদাহরণ):

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সি ++ এ ব্যবহার করার কোনও কারণ মোটেই উচিত নয় । আপনি কাঁচা মেমরিতে একটি পয়েন্টার ফিরিয়ে দিচ্ছেন, আপনাকে নতুন নতুন বস্তু ব্যবহারের অনুমতি দেওয়ার আগে এটি স্থাপন করতে হবে। আপনি যখন মেমরি বরাদ্দ করছেন তার চেয়ে পরের সময়গুলিতে আপনি যদি বস্তুগুলি তৈরি করার উপযুক্ত কারণ না পান তবে আপনার ব্যবহার করা উচিত newবা std::make_uniqueযা স্মৃতি বরাদ্দ করবে, সেইসাথে উপযুক্ত অবজেক্ট তৈরি করবে। উভয় ক্ষেত্রেই std::vectorসঙ্গে reservePROB হয়। আরও ভাল। এমনকি যদি আপনি এগুলি ব্যবহার না করেন তবে 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তৈরির পরিবর্তে ডিলিটার হিসাবে সরাসরি রিয়েলফ্রেশের উত্তরের সরলকরণ:

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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.