c++ - 如何从原始 C 堆内存指针初始化 unique_ptr?
问题描述
我正在使用一个函数(它是库的一部分),它返回一个uint8_t*
指向已在堆上分配并保存图像像素数据的一些内存的原始指针。该函数的调用者负责调用free
指针。
我调用此函数的代码有许多提前终止的分支,因此我需要free(buffer)
在很多时候调用。我认为如果我可以将缓冲区包装在 a 中会更好,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)};
}
推荐阅读
- c# - 将主键 [Key] 添加到 ADO.NET 生成的表类
- reactjs - “列表”类型与“ReactElement”类型不兼容
- laravel - Get user info Laravel Passport
- asp.net - 在自定义 EmployeeRoles 表上使用 Authorize 属性
- python - 如果标签中不存在元素,则打印“”-python编程
- sql - COUNT 与 SELECT by IF 条件
- node.js - 异步读取 csv 文件 - NodeJS
- android - (Android Kotlin)如何在recyclerView中单击按钮从firebase存储中检索图像“名称”?
- swift - 裁剪 UIImage 失败
- html - 为什么我的部分没有低于 HTML 和 CSS 的标题?