【问题标题】:What does "GLib-GObject-WARNING **: instance with invalid (NULL) class pointer" mean?“GLib-GObject-WARNING **:具有无效(NULL)类指针的实例”是什么意思?
【发布时间】:2009-12-31 01:03:19
【问题描述】:

每当我关闭我的 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

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

【问题讨论】:

    标签: c# linux gtk gtk#


    【解决方案1】:

    有些事情搞砸了。

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

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

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

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

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

    【讨论】:

    • 我正在使用 Gtk 2.18.3-1ubuntu2.1 和内置的 GtkBuilder 来处理 glade 文件。使用 Glade 3.6.7-1ubuntu1 编辑 glade 文件。如果重要的话,我也在使用 gnome-globalmenu (code.google.com/p/gnome2-globalmenu),它有时会向 Gtk 引入奇怪的警告。每次运行应用程序时都会收到 g_set_prgname() 警告,而不仅仅是退出时。
    • 哇——我不知道 GlobalMenu。让 Ubuntu 看起来像 Mac!无论如何,我查看了一些 1-2 年前的 g_set_prgname() 资源,这些资源不会产生该警告,所以我认为你的资源必须更新。您可以尝试编写一个最小的 Gtk# 程序,看看它是否也会发出警告。这将告诉您它是特定于您的程序的东西,还是更一般的东西,例如 GlobalMenu 或 Gtk# 绑定到 GTK 中的错误。
    【解决方案2】:

    好吧,我仍然不确定警告的含义,但我知道是什么原因造成的:

    我有一个带有 AccelGroup 的林间空地文件。 AccelGroup 是主窗口及其菜单项的属性。我从窗口中删除了它。这是警告开始的时候。我通过将其从 glade 文件中完全删除(从而将其从菜单项中删除)来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2011-04-29
      • 1970-01-01
      相关资源
      最近更新 更多