関数から一意のvoidポインターを返す


11

void *CIの関数からを取得するには、次のようにします(非常に基本的な例)。

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

使用時に同じ結果を得るにはどうすればよいstd::unique_ptr<>ですか?



1
それを行うことでどのような問題が発生しているか説明してください。
molbdnilo

1
一般的なvoid unique_ptrについては、この回答を参照してください:stackoverflow.com/a/39288979/2527795
vll

mallocこのようなC ++で使用する理由がほとんどないことに注意してください。使用を許可する前に新しいオブジェクトを配置する必要がある生のメモリへのポインタを返しています。メモリを割り当てるときよりも後でオブジェクトを作成する十分な理由がない場合は、newまたはstd::make_uniqueを使用してメモリを割り当て、適切なオブジェクトを作成する必要があります。どちらの場合でもstd::vectorreserve確率が高いです。あまりにも良い。これらを使用しない場合でも、operator newはメモリを割り当てる慣用的な方法であり、ではありませんmalloc
クルミ

回答:


18

次のようにのtype引数voidとして使用するには、カスタムのdeleterを指定する必要があります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ファンクタを作成する代わりに直接削除者として使用する@RealFreshの回答の簡略化:

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.