“GLib-GObject-WARNING **: instance with invalid (NULL) class pointer”是什么意思?

Mat*_*hew 3 c# linux gtk gtk#

每当我关闭 Gtk# 应用程序时,我都会得到以下信息:

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-WARNING **: g_set_prgname() called multiple times

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(/home/matthew/opensbs/OpenSBS/bin/Debug/OpenSBS.exe:5050): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed
Run Code Online (Sandbox Code Playgroud)

我不确定这里发生了什么。我在 google 上发现了一个有类似问题的人,但他们似乎是应用程序的用户,而不是开发人员。一个想法?

Bob*_*phy 6

有什么好乱的。

g_set_prgname() 是一个内部例程,通常只由程序初始化程序调用,如 gdk_init() 或 gtk_init()(调用 gdk_init())。所以如果它被调用两次,那么,它不应该。我阅读了您的回答,也许某些 Glade 初始化例程正在冗余调用它。了解您正在运行的 Glade 和 GTK 版本会有所帮助。

至于其他消息... GLib/GObject 是一个对象系统,具有单继承和 RTTI(运行时类型识别),用 C 实现。

这些警告/关键对表明您的某些对象指针在 RTTI 测试中非常失败。这样的测试在 GTK/GDK 内部很常见——比如“我希望这个指针是这样的,但在我那样对待它之前我最好确定一下。” 你看到的每个消息对都表明一个指针已经被传递给这样的例程,但它所指向的不仅不是预期的对象类型,它甚至没有指向 RTTI 系统识别的任何东西,所以 RTTI 系统举手投足.

这种指针失败的最有可能的罪魁祸首是:

  • 这是一个指向垃圾的野指针
  • 它是陈旧的 - 它曾经指向一个已被破坏的合法对象
  • 它指向一个活动对象,但对象的内容已严重损坏,RTTI 系统无法确定对象的类型