要从C语言函数中获取void *
类型的返回值,可以像下面这样做(非常基础的示例):
void *get_ptr(size_t size)
{
void *ptr = malloc(size);
return ptr;
}
当使用std::unique_ptr<>
时,我如何实现相同的结果?
要从C语言函数中获取void *
类型的返回值,可以像下面这样做(非常基础的示例):
void *get_ptr(size_t size)
{
void *ptr = malloc(size);
return ptr;
}
当使用std::unique_ptr<>
时,我如何实现相同的结果?
您需要指定自定义删除器才能像这样将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());
}
auto get_ptr(std::size_t size) {
return std::unique_ptr<void, decltype(&std::free)>(std::malloc(size), std::free);
}
#include <memory>
std::unique_ptr<char[]> get_ptr(std::size_t size)
{
return std::make_unique<char[]>(size);
}
malloc
。您正在返回指向原始内存的指针,需要在使用之前将其放置到新对象中。如果您没有很好的理由在分配内存时创建对象,则应使用new
或std::make_unique
,它们将分配内存并创建适当的对象。在任何情况下,使用带有reserve
的std::vector
可能更好。即使您不使用这些,operator new
也是分配内存的惯用方式,而不是malloc
。 - walnut