Macos gtk_容器_在mac上添加挤压

Macos gtk_容器_在mac上添加挤压,macos,gtk3,Macos,Gtk3,我创建了一个GtkFixed对象,并通过gtk_container_add将其放入GtkEventBox中(当然,要销毁前一个子对象)。这种方法在Windows上运行良好,但在Mac上会崩溃 堆栈跟踪显示应用程序在gtk上崩溃。我尝试使用user set_parent过程,但它也崩溃了: [debug][New Thread 0x1b0f of process 88699] [debug]Program received signal SIGSEGV, Segmentation fault. [

我创建了一个GtkFixed对象,并通过gtk_container_add将其放入GtkEventBox中(当然,要销毁前一个子对象)。这种方法在Windows上运行良好,但在Mac上会崩溃

堆栈跟踪显示应用程序在gtk上崩溃。我尝试使用user set_parent过程,但它也崩溃了:

[debug][New Thread 0x1b0f of process 88699]
[debug]Program received signal SIGSEGV, Segmentation fault.
[debug]0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
[debug]>>>>>>cb_gdb:

Program received signal SIGSEGV, Segmentation fault.
In gtk_widget_set_parent () (/usr/local/lib/libgtk-3.0.dylib)

[debug]> bt 30
[debug]#0  0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
在主线程和窗口的“实现”回调中运行的代码。一样

代码是:

void main_view_reset_list_view(GtkWidget* list_view, GtkWidget* new_item)
{
    GtkEventBox* eb = GTK_EVENT_BOX(list_view);
    GtkBin* bin = GTK_BIN(list_view);
    GtkContainer* container = GTK_CONTAINER(list_view);
    GtkWidget* subview;
    subview = gtk_bin_get_child(bin);
    if (subview)
    {
        gtk_container_remove(container, subview);
        gtk_widget_unparent (subview);
        gtk_widget_destroy(subview);
    }

    gtk_widget_set_parent(new_item, container); // crash
    GtkWidget* parent = gtk_widget_get_parent(container);
    GtkWidget* parent2 = gtk_widget_get_parent(new_item); // 0 on windows, crash on mac
    if (new_item)
    {
        gtk_container_add(container, new_item);
        gtk_widget_show(new_item);
    }

    gtk_widget_show(list_view);
}
UPD:
set_parent使控件在windows上以某种方式消失了

我跟踪了gtk和glib源代码,发现G_IS_OBJECT()失败了,这很奇怪。这让我想到,这个问题与指针有关。我调试了我的代码,发现它是真的

GtkWidget* create_widget()
{
   return gtk_fixed_new(); // result points to 0x1018bf830 
}

void refresh_widgets()
{
   GtkWidget* w = create_widget(); // w points to 0x18bf830
}
我以前确实遇到过此类问题,因此所有返回指针的代码都已更改:

char* generate_string();

所以为了解决我的问题,我必须以这种方式提供正确的指针。比如:

void create_widget(GtkWidget** out);
UPD:我注意到指针之间的区别。简而言之,在返回时,它们在64位系统上被裁剪为32位

UPD2:最后,我做了所有的更改,它就是这样工作的

void create_widget(GtkWidget** out);