#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
правильного?