传递给 GTK 回调时取消引用 C++ 中的字符串向量

Dereferencing a String Vector in C++ when passing to GTK callback

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

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;
}

点击按钮显示时,出现'bad alloc'错误,程序崩溃

当我尝试这个时:

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

它打印出 vec: 但没有元素,据说大小是矢量的 18446744073706420840。

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

  • 您应该使用 g_signal_connect_object 而不是 g_signal_connect_swapped

  • displayvecchoices 声明更改为

    static void displayvecchoices(gpointer   data, GtkWidget *widget)