Повторное использование malloc для передачи разных указателей обработчикам сигналов

#c #gtk #malloc #glib

#c #gtk #malloc #glib

Вопрос:

В следующем блоке кода я создаю указатель на структуру, чтобы я мог передавать несколько переменных в обработчик сигналов gtk, который автоматически g_free() настраивается на структуру, когда обработчик отключен.

Вторая часть malloc снова вводит переменную и отправляет новый указатель в новый обработчик сигналов. Сработает ли это?

Просто прочитав это, я предполагаю, что это оставит первые данные структуры на месте в указателе и создаст новый указатель, в котором я смогу изменить данные позже, при этом позже должным образом утилизируя память.

Зная, что malloc это вряд ли так просто, мне интересно, есть ли что-то, чего мне не хватает, или что я должен принять во внимание.

 signaldata * s;
s = (signaldata *) g_malloc(sizeof(signaldata *));
s->col = 0; s->secondaryCol = -1; s->model = GTK_TREE_MODEL(itemModel);
g_signal_connect_data(firstWidget,"edited",(GCallback) treeview_text_edited,s, (GClosureNotify) g_free, 0);

s = (signaldata *) g_malloc(sizeof(signaldata *));
s->col = 1; s->secondaryCol = -1; s->model = GTK_TREE_MODEL(itemModel);
g_signal_connect_data(secondWidget,"edited",(GCallback) treeview_text_edited,s, (GClosureNotify) g_free, 0);
  

Ответ №1:

Все должно быть в порядке, потому что сам указатель копируется перед вызовом g_signal_connect_data , поэтому не имеет значения, что позже вы назначите ему новый адрес, выполнив второе g_malloc действие.

Однако вы теряете свою единственную ссылку на первую g_malloc общую память (если только каким-то образом она не становится доступной из firstWidget ), и это может быть нежелательным, если вы хотите выполнить какие-либо дальнейшие манипуляции с ней вручную.

Комментарии:

1. Нет, просто нужно было знать, что сигналы будут работать, и я не получу утечку памяти. Спасибо!

2. память по-прежнему будет доступна из обработчика сигналов treeview_text_edited() , где она в любом случае необходима.

Ответ №2:

Похоже, что произойдет утечка памяти, если сигнал никогда не будет использоваться.

Это может быть или не быть проблемой для вас.

Комментарии:

1. Возможно, но зачем это? Данные являются free общими при отключении обработчика сигналов, что произошло бы после gtk_main_quit правильного?