创建SinkInputInfo数组时报pulse_audio_sink_input_info_destroy未定义错误
问题根因
该错误由PulseAudio的Vala绑定缺陷导致:Vala编译器为SinkInputInfo结构体数组自动生成内存释放逻辑时,会尝试调用名为pulse_audio_sink_input_info_destroy的销毁函数,但官方绑定没有为该结构体定义对应符号,原生C库实际提供的释放函数为pa_sink_input_info_free,二者名称不匹配就会触发编译链接报错。
可选用的修复方案
- 无主引用适配(适用于临时持有API返回结果的场景)
如果你不需要自行管理数组元素的生命周期,仅用数组承接PulseAudio回调返回的引用,给数组添加unowned修饰符即可关闭自动释放逻辑,不会触发不存在的销毁函数调用:
using PulseAudio; public void main () { unowned SinkInputInfo[] sink_inputs; }
- 手动补充函数绑定(适用于需要自动管理数组内存的场景)
在代码开头手动添加函数映射,将Vala生成的销毁函数名指向原生C库的实际释放函数即可解决符号缺失问题:
[CCode (cname = "pa_sink_input_info_free")] extern void pulse_audio_sink_input_info_destroy (SinkInputInfo* info); using PulseAudio; public void main () { SinkInputInfo[] sink_inputs; }
- 手动内存管理(适用于需要精细控制生命周期的场景)
改用GLib的PointerArray等容器手动存储实例,调用原生pa_sink_input_info_free函数释放元素,避开Vala自动生成的数组释放逻辑。
内容的提问来源于stack exchange,提问作者ChildishGiant
相关产品推荐
相关产品推荐

