使用std :: unique_ptr< ...>管理CoreFoundation CFType资源

时间:2017-06-01 00:04:35

标签: c++ unique-ptr core-foundation cftypes

我使用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(…)一样?

0 个答案:

没有答案