我使用std::unique_ptr
来管理CoreFoundation框架中的不透明类型。必须手动释放CoreFoundation类型(aka CFTypes
),因此std::unique_ptr
类型的配方如下所示:
namespace detail {
template <typename CoreFoundationType>
struct cfreleaser {
constexpr cfreleaser() noexcept = default;
template <typename U> cfreleaser(cfreleaser<U> const&) noexcept {};
void operator()(CoreFoundationType __attribute__((cf_consumed)) cfp) {
if (cfp) { CFRelease(cfp); cfp = nullptr; }
}
};
template <typename CoreFoundationType>
using cfp_t = std::unique_ptr<
typename std::decay_t<
std::remove_pointer_t<CoreFoundationType>>,
cfreleaser<CoreFoundationType>>;
}
...这种安排让我可以手动释放CFType
资源,例如:
CGColorSpaceRef deviceRGB = CGColorSpaceCreateDeviceRGB();
/// … make use of `deviceRGB`
CGColorSpaceRelease(deviceRGB); /// release `deviceRGB`
...自动发布方案,如下:
detail::cfp_t<CGColorSpaceRef> deviceRGB(CGColorSpaceCreateDeviceRGB());
/// … make use of `deviceRGB`
/// … `deviceRGB` releases automatically on scope exit
...这意味着我最终会发布我使用CFType
创建的CFRelease(…)
个实例中的每一个 - 从不使用CFType
可能存在的任何专门的发布函数({{1}在上面的示例代码段中)。
在我阅读the CoreFoundation docs - 以及基于CGColorSpaceRelease(…)
的框架like CoreGraphics的文档时 - 我看到的每个自定义发布程序函数都被写成“相当于{ {1}}“(for example)...我的问题是,这种普遍性有什么例外吗?换句话说,在任何和所有CFType
个实例上使用CFRelease
是否安全,就像我在这种情况下使用CFRelease(…)
一样?