【问题标题】:How to initialize unique_ptr from raw C heap memory pointer? [duplicate]如何从原始 C 堆内存指针初始化 unique_ptr? [复制]
【发布时间】:2020-06-10 20:55:37
【问题描述】:

我正在使用一个函数(它是库的一部分),它返回一个原始的uint8_t* 指针,指向一些已在堆上分配并保存图像像素数据的内存。这个函数的调用者负责在指针上调用free

我调用此函数的代码有许多提前终止的分支,因此我需要在很多时候调用free(buffer)。我认为如果我可以将缓冲区包装在unique_ptr 中会更好,这样当它超出范围时,内存会自动释放。

我怎样才能做到这一点?

作为参考,decleration 函数看起来像这样:uint8_t* getFrame()(我已经知道图像的宽度、高度和通道数以及缓冲区的长度);

【问题讨论】:

标签: c++ heap-memory smart-pointers unique-ptr raw-pointer


【解决方案1】:

这很简单! 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)}; 
}

【讨论】:

  • 简单干净。很好的答案。很高兴我不只是欺骗了这个问题。
  • 太棒了,感谢您的快速解决方案!
  • 用你上面的例子,我需要做my_unique_ptr&lt;uint8&gt;frame {buffer};或my_unique_ptr&lt;uint8[]&gt;frame {buffer}; ?
  • 我会使用uint8[] 只是为了让其他人理解它是一个缓冲区而不是指向单个uint8 的指针,但与delete 不同,delete 对单独分配的对象进行了优化,@987654334 @ 不区分单个对象和对象数组
  • 非常感谢@J.AntonioPerez
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2019-12-13
  • 2018-08-01
  • 1970-01-01
  • 2015-10-03
  • 2015-05-01
相关资源
最近更新 更多