如何从原始 C 堆内存指针初始化 unique_ptr?
How to initialize unique_ptr from raw C heap memory pointer?
我正在使用一个函数(它是库的一部分),它 returns 一个原始的 uint8_t*
指针指向一些已在堆上分配并保存图像像素数据的内存。该函数的调用者负责在指针上调用 free
。
我调用此函数的代码有许多提前终止的分支,因此我需要在许多点调用 free(buffer)
。我认为如果我可以将缓冲区包装在 unique_ptr
中会更好,这样当它超出范围时,内存会自动释放。
我怎样才能做到这一点?
作为参考,函数 decleration 看起来像这样:uint8_t* getFrame()
(我已经知道图像的宽度、高度和数字通道,因此缓冲区的长度);
这很简单! std::unique_ptr
的模板如下所示:
template<class T, class Deleter>
class unique_ptr;
而 Deleter 用于在 unique_ptr
指向的值超出范围时清理它。我们可以写一个使用free
真的很简单!
struct DeleteByFree {
void operator()(void* ptr) const {
free(ptr);
}
};
template<class T>
using my_unique_ptr = std::unique_ptr<T, DeleteByFree>;
现在,每当您使用 my_unique_ptr
的实例时,它都会调用 C 的 free()
函数来清理自身!
int main(){
// This gets cleaned up through `free`
my_unique_ptr<int> ptr {(int*)malloc(4)};
}
我正在使用一个函数(它是库的一部分),它 returns 一个原始的 uint8_t*
指针指向一些已在堆上分配并保存图像像素数据的内存。该函数的调用者负责在指针上调用 free
。
我调用此函数的代码有许多提前终止的分支,因此我需要在许多点调用 free(buffer)
。我认为如果我可以将缓冲区包装在 unique_ptr
中会更好,这样当它超出范围时,内存会自动释放。
我怎样才能做到这一点?
作为参考,函数 decleration 看起来像这样:uint8_t* getFrame()
(我已经知道图像的宽度、高度和数字通道,因此缓冲区的长度);
这很简单! std::unique_ptr
的模板如下所示:
template<class T, class Deleter>
class unique_ptr;
而 Deleter 用于在 unique_ptr
指向的值超出范围时清理它。我们可以写一个使用free
真的很简单!
struct DeleteByFree {
void operator()(void* ptr) const {
free(ptr);
}
};
template<class T>
using my_unique_ptr = std::unique_ptr<T, DeleteByFree>;
现在,每当您使用 my_unique_ptr
的实例时,它都会调用 C 的 free()
函数来清理自身!
int main(){
// This gets cleaned up through `free`
my_unique_ptr<int> ptr {(int*)malloc(4)};
}