LINUX.ORG.RU

GTK: gtk_widget_destroy() Ошибка сегментирования


0

1

Замучился. Не пойму, как отловить ошибку. Создаю диалог. В нем всякие списки и кнопки помимо стоковых кнопок в нижней части. Дальше gtk_dialog_run(). Потом анализ ответов от стоковых кнопок. И уже при вызове gtk_widget_destroy() для диалога получаю ошибку сегментирования. Как можно такую ситуацию отдиагностировать?

Ответ на: комментарий от hilbert_space

А что-нибудь из соображений здравого смысла можете посоветовать? Мне приходит в голову лишь одно объяснение. В иерархии дочерних виджетов диалога что-то не так. Поэтому при удалении диалога приходим к ошибке. Но если бы это было так, то диалог бы не отображался корректно.

zloy_starper ★★★
() автор топика

код покажи. и навешены ли обработчики сигналов типа «destroy» и «delete-event» или дималоговых «close» и «responce»?

ananas ★★★★★
()
Ответ на: комментарий от ananas

void ChangePortCallback(GtkWidget *widget, gpointer data)
{
   GtkTreeSelection *selectionTargetPort, *selectionPort;
   GtkTreeModel *model, *modelTargetPort, * modelPort;
   GtkTreeIter iter, *iter2;
   GtkWidget * list = (GtkWidget *) data;
gchar *name;
char *portname;
char message[100], ACLiD[50];
   PGresult * res;
   gint result;
   int row, i;
   NameList *PortList = NULL;
   ListEntry PortListEntry;
   
   char *p;
   
   GtkWidget *EditPortDialog, * editbox, *viewTargetPort, *viewPort, *buttonbox, *adder, *remover, *editl, *edite, *editb;
   GtkTreeSelection *selection;
   GtkTreeViewColumn *column;
   GtkTreeIter ACLiter, *child;
   GtkCellRenderer *cell_renderer;

   
   selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
   if (gtk_tree_selection_get_selected(selection, &model, &ACLiter))
      {

      gtk_tree_model_get (model, &ACLiter, 0, &name, -1);

/* Проверяем - является ли выделенная строка acl-ом, или login-ом в acl*/

      if (!(gtk_tree_model_iter_children(model, child, &ACLiter)))
         {
         return ;
         }

      EditPortDialog = gtk_dialog_new_with_buttons («Редактирование портов»,
NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_OK,
GTK_RESPONSE_ACCEPT,
GTK_STOCK_CANCEL,
GTK_RESPONSE_REJECT,
NULL);   
   
   
/* Создаем основной hbox */

      editbox = gtk_hbox_new (FALSE, 1);
      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (EditPortDialog)->vbox),
editbox, TRUE, TRUE, 0);

/* Создаем основной в hbox боксы, списки, кнопки */
.......
   
      PortListEntry.List = listPort;
      PortListEntry.Entry = edite;
      PortListEntry.Model = modelPort;

      
      g_signal_connect (G_OBJECT (adder), «clicked», G_CALLBACK (AddPortToACLCallback), (gpointer) &PortList);
      g_signal_connect (G_OBJECT (remover), «clicked», G_CALLBACK (DeletePortFromACLCallback), (gpointer) &PortList);
      g_signal_connect (G_OBJECT (editb), «clicked», G_CALLBACK (NewPortCallback), (gpointer) &PortListEntry);


/* Заполняем списки */

......



   


gtk_widget_show_all(EditPortDialog);

   
   result = gtk_dialog_run(GTK_DIALOG(EditPortDialog));
   

   if (result == GTK_RESPONSE_REJECT)
      {
         gtk_widget_destroy(EditPortDialog);
         return ;
      }
   if (result == GTK_RESPONSE_ACCEPT)
      {

......
         gtk_widget_destroy(EditPortDialog);
      }
   }
   return ;
   
}

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

выложи где-нибудь, на том же pastebin

Deleted
()

А разве *_destroy() не являются «настоятельно нерекомендуемыми»? Ведь вроде бы достаточно сделать g_object_unref() или как там его?

no-dashi ★★★★★
()
Ответ на: комментарий от zloy_starper

единственное, что смущает - при создании диалога parent у тебя NULL, однако указан флаг GTK_DIALOG_DESTROY_WITH_PARENT.

и еще одно, диалоговый vbox лучше получать через gtk_dialog_get_content_area, а не обращаться напрямую к полю vbox

а так да, лучше полный кусок кода на pastebin выложить, чтобы самому пощупать можно было

ananas ★★★★★
()
Ответ на: комментарий от no-dashi

> А разве *_destroy() не являются «настоятельно нерекомендуемыми»?

не все.

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.