2

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

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

我怎样才能做到这一点?

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

4

1 回答 1

5

这很简单!的模板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)}; 
}
于 2020-06-10T21:03:12.767 回答