gpt4 book ai didi

c++ - 用自定义删除器封装 C 类型指针的常用方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:24 26 4
gpt4 key购买 nike

几乎所有来自 C 库的 C 类型对象都有一些自定义删除器,例如IplImage*来自 OpenCV 的 cvReleaseImage(IplImage**)删除函数。在 C++ 中,我希望我的代码始终确保最终删除每个对象。

我想以某种方式使用 std::shared_ptr 最有意义及其自定义删除器功能。

一个示例/可能的解决方案在 this question 中我会在哪里使用 shared_ptr<IplImage>但有一个特殊版本的 default_delete<IplImage> .但是请参阅那里关于缺点的答案:C++ 标准不能保证 shared_ptr将使用 default_delete作为默认删除器,我不允许专门化 default_delete如我所愿(参见 here )。

另一种解决方案是这样的:

shared_ptr<IplImage> makeIplImage(IplImage* ptr) {
return shared_ptr<IplImage>(ptr, default_delete<IplImage>()); // using my specialised default_delete
}

但我必须小心,永远不要忘记调用 makeIplImage当我想包装我的 IplImage* 时.

另一种解决方案是编写我自己的包装器对象类,例如

class IplImageObj {
shared_ptr<IplImage> ptr;
public:
IplImageObj(IplImage* img) : ptr(img, default_delete<IplImage>()) {} // again using my specialised default_delete
// ...
};

我在野外还没有真正看到那么多这样的解决方案。使用它们是个坏主意吗?如果是这样,那么我想我错过了什么,但是什么?或者什么是最常见/最有意义的方式?

最佳答案

包装器似乎是个好方法。如果您为 C++ 类定义析构函数,那么它可以为您释放内存。当你的类超出范围时,析构函数会自动调用,所以这应该会给你一个你所追求的想法。您还可以在析构函数中实现对 NUL ptr 或 dangling ptr 的检查,如果这在内存清理过程中有用的话。

class IplImageObj {
IplImage* ptr;
~IplImageObj(){ /* The destructor: you can call cvReleaseImage from here */}
public:
IplImageObj(IplImage* img): ptr(img){}
// ...
};

在上面的代码片段中,数据成员 ptr 是私有(private)的,因此您可能需要访问函数以便对其执行任何操作。

我的 C++ 讲师强烈反对 publicclass 中声明数据成员。如果要让数据成员公开,那么struct拥有现在class的所有功能,人们对数据成员的公开访问也更加宽容……

关于c++ - 用自定义删除器封装 C 类型指针的常用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20284130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com