传递给 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)
我有这段代码试图将向量传递给回调函数:
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)