传递GTK回调时,请在C 中删除字符串向量



我有这个代码,该代码试图将向量传递给回调函数:

static void displayvecchoices( GtkWidget *widget, gpointer   data ) {
    std::vector<std::string> vecp = *(std::vector<std::string> *)(data);
    std::cout<<"vec: "<<vecp[0]<<std::endl;
}
int main(int argc, char *argv[] ) {
    GtkWidget *window;
    GtkWidget *display;
    gtk_init(&argc, &argv);
    window = gtk_dialog_new ();
    g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL);
    gtk_window_fullscreen (GTK_WINDOW(window));
    std::vector<std::string> vec;
    vec.push_back("1");
    display = gtk_button_new_with_label ("Display");
    g_signal_connect_swapped (display, "clicked", G_CALLBACK (displayvecchoices), &vec);
    gtk_widget_set_can_default (display, TRUE);
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), display, TRUE, TRUE, 0);
    gtk_widget_grab_default (display);
    gtk_widget_show (display);
    gtk_main();
    return 0;
}

单击按钮显示时,我会遇到"不好的Alloc"的错误,并且程序崩溃了。

当我尝试一下时:

std::vector<std::string>* vecp = (std::vector<std::string> *)(data);
std::cout<<"vec: "<<(*vecp)[0]<<std::endl;

它打印出vec:但是没有元素和大小为矢量的184467444073706420840。

看起来,您的回调参数已交换:

  • 您应该使用g_signal_connect_object代替g_signal_connect_swapped

  • displayvecchoices声明更改为

    static void displayvecchoices(gpointer   data, GtkWidget *widget)
    

最新更新