奇怪的FluidSync断言('settings!=NULL')结果

奇怪的FluidSync断言('settings!=NULL')结果,c,debugging,glib,C,Debugging,Glib,下面的小示例程序为我提供了一个断言错误设置!=“NULL”失败,我无法理解为什么它认为设置结构指针为NULL 文件test.c: #include <fluidsynth.h> int main(int argc, char** argv) { fluid_settings_t* settings = new_fluid_settings(); fluid_synth_setint(settings, "synth.polyphony", 128); //asse

下面的小示例程序为我提供了一个断言错误设置!=“NULL”失败,我无法理解为什么它认为设置结构指针为NULL

文件test.c:

#include <fluidsynth.h>

int main(int argc, char** argv) 
{
    fluid_settings_t* settings = new_fluid_settings();
    fluid_synth_setint(settings, "synth.polyphony", 128); //assertion error
    delete_fluid_settings(settings);
    return 0;
}
但是fluid_return_val_if_fail只是一个调用GLib的g_return_val_if_fail utils/fluid_sys.h:59的简单宏

因为设置地址是有效的,所以我想不出其他地址。空指针指向地址0x00不是真的吗


我忘了什么重要的东西了吗?

在使用前打印地址,使用例如printft设置在%p\n,settings;;当然,您也可以自己添加保护:

if (settings != NULL)
{
  fluid_synth_setint(settings, "synth.polyphony", 128);
}
如果是新电话失败了,你当然需要探究为什么会发生这种情况

过去,您必须手动初始化FluidSynth似乎依赖的glib库,但现在不需要了


我简单地看了一下,似乎它试图初始化设置对象内的互斥体以使其线程安全,我想,因此可能需要在调用新的流体设置之前,向main添加一个调用。

在gdb会话中,p*设置做什么?嗨,在运行新流体设置函数之后,它会给我一个调用。嗨,使用%p打印地址会提供一个有效地址。然而,GDB给了我一个设置结构的定义。添加g_thread_init并没有解决问题。我很想知道发生了什么事。无论如何,谢谢你的帮助。所以在谷歌搜索你的粘贴站后,我找到了上游bug报告,它指向这里并标记为关闭。解决方案是由于不正确的文档导致API使用不当。上游文档仍然不正确。具体而言,流体合成设置应为流体设置设置。我们有一个下游bug,症状与此相似,但似乎有不同的原因:
if (settings != NULL)
{
  fluid_synth_setint(settings, "synth.polyphony", 128);
}