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

В следующем блоке кода я создаю указатель на структуру, чтобы я мог предоставить несколько переменных для обработчика сигнала 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);

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

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

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

0 голосов
/ 11 мая 2011

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

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

...