日期:2014-05-16  浏览次数:20593 次

回调函数中疑似内存溢出,GTK+
我的代码又出现了一个问题,回调函数执行第二遍会让程序挂掉,且无任何提示信息。

请看我的代码,实现了一个点击按钮后,为主窗口返回所选择的日期之对话框。

回调函数中疑似内存溢出,不知道具体该如何改进,请高手点睛。

C/C++ code

void dialog_calendar (GtkEntry *widget,
                      DateTrans *dtEntry){ //DateTrans是我自定义的结构体指针,分别指向一个窗口和输入框
   
   GtkWidget *dlCalendar;
   GtkWidget *vbCalendar;
   GtkWidget *calendar;
   GtkWidget *hbb;
   gint result;
   guint year;
   guint month;
   guint day;
   char *calendardate;
   
   dlCalendar = gtk_dialog_new_with_buttons ("Calendar",
                                             GTK_WINDOW(dtEntry->window),
                                             GTK_DIALOG_MODAL,
                                             GTK_STOCK_CLEAR,
                                             GTK_RESPONSE_NO,
                                             GTK_STOCK_CANCEL, 
                                             GTK_RESPONSE_REJECT,
                                             GTK_STOCK_OK, 
                                             GTK_RESPONSE_OK,
                                             NULL);
                                            
   gtk_dialog_set_has_separator (GTK_DIALOG (dlCalendar), FALSE);
   
   vbCalendar = GTK_DIALOG (dlCalendar)->vbox;
   gtk_widget_show (vbCalendar);

   calendar = gtk_calendar_new ();
   gtk_widget_show (calendar);
   gtk_box_pack_start (GTK_BOX (vbCalendar), calendar, TRUE, TRUE, 0);
   
   hbb = GTK_DIALOG (dlCalendar)->action_area;
   gtk_widget_show (hbb);
   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbb), GTK_BUTTONBOX_END);

   
   result = gtk_dialog_run(GTK_DIALOG(dlCalendar));
   
   switch (result){
       case  GTK_RESPONSE_NO:
          gtk_entry_set_text(GTK_ENTRY(dtEntry->entry), "");
          break;
       case GTK_RESPONSE_OK:
          gtk_calendar_get_date(GTK_CALENDAR(calendar),
                                &year,&month,&day);
          g_sprintf(calendardate,"%d-%d-%d",year,month,day);
          gtk_entry_set_text(GTK_ENTRY(dtEntry->entry), 
                             calendardate);
          break;
   }
   //free(calendardate);   //加了这句后,第一次执行该函数就会挂调。
   gtk_widget_destroy(dlCalendar);

}




------解决方案--------------------
指针calendardate没初始化