在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
相关产品推荐
相关产品推荐

