You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++中创建GstValueArray更新GStreamer Pad属性遇内存错误求助

解决GStreamer中GstValueArray更新Pad属性时的内存分配错误

你的代码核心问题是调用g_object_set时传递GValue的方式错误,导致GLib的可变参数解析逻辑出错,误将GValue结构体的内部数据当成了需要分配内存的大尺寸参数,从而触发了62GB的内存分配请求。

错误原因

g_object_set的可变参数列表中,对于GValue类型的属性,需要传递指向GValue的指针,而不是直接传递GValue变量。你当前的代码直接传new_dimensions,会让GLib错误地解析参数类型,引发内存分配异常。

修正后的代码

const auto pad = gst_element_get_static_pad(videomixer, sink_name.c_str());
if (!pad) {
    // 处理pad获取失败的情况
    return;
}

// 创建width的GValue
GValue width = G_VALUE_INIT;
g_value_init(&width, G_TYPE_INT);
g_value_set_int(&width, cameraUpdate["width"]);

// 创建height的GValue
GValue height = G_VALUE_INIT;
g_value_init(&height, G_TYPE_INT);
g_value_set_int(&height, cameraUpdate["height"]);

// 创建GstValueArray
GValue new_dimensions = G_VALUE_INIT;
g_value_init(&new_dimensions, GST_TYPE_ARRAY);
gst_value_array_append_value(&new_dimensions, &width);
gst_value_array_append_value(&new_dimensions, &height);

// 修正:传递GValue的指针给g_object_set
g_object_set(pad, "dimensions", &new_dimensions, nullptr);

// 释放资源:用完GValue后必须unset
g_value_unset(&new_dimensions);
g_value_unset(&height);
g_value_unset(&width);
g_object_unref(pad);

额外注意事项

  • 所有初始化的GValue都必须调用g_value_unset()释放资源,避免内存泄漏。
  • 获取到的Pad对象使用完后要调用g_object_unref()释放,符合GObject的内存管理规则。
  • 可以先通过g_object_class_find_property()确认属性的类型,确保传入的参数类型匹配。

内容的提问来源于stack exchange,提问作者bream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:05:21