从函数返回唯一的空指针


11

要从void *CI中的函数获取a ,将执行以下操作(非常基本的示例):

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

请注意,这样的mallocC ++ 几乎绝对没有理由使用。您正在返回一个指向原始内存的指针,您需要在该指针中放置新对象才能使用它。如果没有足够的理由在分配内存之后创建对象,那么应该使用newstd::make_unique分配内存以及创建适当的对象。在两种情况下,std::vector都有reserveis prob。也更好。即使您不使用这些,也不operator new是分配内存的惯用方式malloc
胡桃

Answers:


18

您需要指定自定义删除程序,以便像这样使用voidas unique_ptr的type参数:

#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直接用作删除程序,而不是构造函子:

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

不过,请参阅我对这个问题的评论。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.