Действительно, у вас, похоже, утечка памяти, но это не ваша проблема. Проблема в том, что истинный путь вашего оператора if просто вставляет второе значение, связанное с тем же ключом, а это не то, что вам нужно.
Типичным шаблоном для этого алгоритма проверки, если существует, и алгоритмом приращения обычно является что-то вроде
gpointer val = g_hash_table_lookup(hash_table, key);
if (val == NULL) {
val = g_malloc0(...);
g_hash_table_insert(hash_table, key, val);
}
*val = /* something */;
Важно помнить, что, получив указатель на значение, связанное с каким-либо ключом, вы можете просто изменить его напрямую.
Если этот код будет выполняться несколькими потоками параллельно, тогда весь блок должен быть защищен мьютексом, возможно, с помощью GMutex: http://developer.gnome.org/glib/2.28/glib-Threads.html
gcc предоставляет встроенные встроенные атомарные функции, скажем, для атомарного увеличения значения, см. http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html