g_object_set_data имеет дыры в памяти - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю приложение GTK3 и использую g_object_set_qdata в GtkListBoxRow для целей поиска.

Я использую этот код:

GArray      *complib;
#define row_get_entry(row) (ElcCompLibEntry*)g_object_get_qdata(G_OBJECT(row),registryquark)
GtkWidget* elc_registry_listbox_make_item(ElcCompLibEntry* curritem)
{
  /* I remove UI creation */
  GtkWidget* intermediate = gtk_list_box_row_new();
  gtk_container_add(GTK_CONTAINER(intermediate),GTK_WIDGET(mainbox));
  gtk_widget_show_all(GTK_WIDGET(intermediate));
  g_object_set_qdata(G_OBJECT(intermediate),registryquark,curritem);
  return intermediate;
};
  static GtkWidget* saved = NULL;
  GtkWidget* new=elc_registry_listbox_make_item(entry);
  gtk_container_add(GTK_CONTAINER(listbox->real_listbox),new);
  if (saved)
    g_debug("saved entry is at position %d",((gintptr)row_get_entry(saved)-(gintptr)complib->data)/sizeof(ElcCompLibEntry));
  saved=new;
  g_debug("entry is at position %d",((gintptr)row_get_entry(new)-(gintptr)complib->data)/sizeof(ElcCompLibEntry));

Вывод моей программы:

** (elc:9906): DEBUG: 18:51:10.623: entry is at position 0

** (elc:9906): DEBUG: 18:51:10.625: saved entry is at position -14015
** (elc:9906): DEBUG: 18:51:10.625: entry is at position 1

** (elc:9906): DEBUG: 18:51:10.627: saved entry is at position 32
** (elc:9906): DEBUG: 18:51:10.627: entry is at position 2

** (elc:9906): DEBUG: 18:51:10.629: saved entry is at position 2
** (elc:9906): DEBUG: 18:51:10.629: entry is at position 3

** (elc:9906): DEBUG: 18:51:10.631: saved entry is at position 25921
** (elc:9906): DEBUG: 18:51:10.631: entry is at position 4

ElcCompLibEntry - простая структура.g_object_set_qdata_full просто портит старые данные, кварк инициализируется, даже когда я запускаю его в главном потоке, я получаю тот же результат (только saved entry is at position 2 является константой).

Может кто-нибудь помочь найти кореньПроблема и / или отправить мне соответствующую документацию?

Спасибо, что уделили время!

1 Ответ

0 голосов
/ 12 февраля 2019

Per https://developer.gnome.org/glib/stable/glib-Arrays.html#GArray,

Данные могут перемещаться при добавлении элементов в GArray.

Трудно сказать, не видя код, который создает и добавляетв complib, но complib->data не является константой, и ваши указатели, хранящиеся в qdata, вероятно, становятся недействительными при изменении размера массива.

Чтобы предотвратить это, попробуйте создать массив с g_array_sized_new() предварительно выделив необходимое количество элементов.

...