【问题标题】:using unique_ptr with custom deleter for GError将 unique_ptr 与 GError 的自定义删除器一起使用
【发布时间】:2022-01-21 11:03:52
【问题描述】:

将 unique_ptr 与自定义删除器一起用于返回 ptr 的 c 函数非常简单,但我如何将它用于将 ptr 的 ptr 作为参数的函数(如 GError)

我在几个案例中遇到过这种情况,但没有找到直接的方法来做到这一点。我错过了什么吗?

using Element = std::unique_ptr<GstElement, void (*)(GstElement*)>;
using Error = std::unique_ptr<GError, void (*)(GError*)>;
...
GError* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref); // ok

Error uniq_err {nullptr, error_free};
Element pipeline(gst_parse_launch(str, &(uniq_err.get())), object_unref); // error: lvalue required as unary ‘&’ operand

我能想到的唯一方法是稍后分配它

GError* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref);
Error uniq_err {plain_err, error_free};
plain_error = nullptr;

【问题讨论】:

  • 除非你特别喜欢投反对票,否则不要用 C 标签标记 C++ 问题。
  • @JonathanLeffler 问题是关于在 c++ unique_ptr 中使用来自 c 的普通指针,我仍然只标记 c++ 吗?
  • @tejas 除非您希望您的程序使用 C 编译器进行编译,否则无需使用 [C] 标记。

标签: c++ gstreamer unique-ptr


【解决方案1】:

这部分代码:

GError* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref);

建议gst_parse_launch() 分配GError* 并返回它。在这种情况下,您不能按照自己的方式使用unique_ptr。因为unique_ptr 只是管理指针的生命周期。

您可以尝试使用unique_ptr 来管理您的指针:

struct ErrorRelease {
    void operator()(GError* ptr) {
        // release pointer
    }
};
using Error = std::unique_ptr<GError, ErrorRelease>;

GError* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref);

Error uniq_err(plain_err);

在此之后,您必须记住不要手动释放 plain_err,因为它是由您的 unique_ptr 管理的。可以给它赋值另一个值,只是不要手动释放它。

【讨论】:

  • 这或多或少是我在问题中提到的方式,还是我错过了什么?
  • @tejas 是的,是的。我只是没有在您的帖子中看到,所以我将其添加到我的答案中。
【解决方案2】:

我发现从 lambda 返回一个元组稍微好一点,

auto [pipeline, err] = [&]() noexcept {
    GError* err = nullptr;
    auto* pipeline = gst_parse_launch(str, &err);
    return std::tuple{Element{pipeline, object_unref}, Error{err, error_free}};
}();

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2023-03-11
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多