2017-08-12 3 views
1

Ich benutze ein GHashTable von glib und möchte ein Schlüsselwertpaar nach Schlüssel löschen. Wie in der docs beim Aufruf g_hash_table_remove() beschrieben, müssen Sie den Schlüssel und Wert selbst freigeben, wenn sie dynamisch zugewiesen wurden. Aber wie bekomme ich einen Zeiger auf den Schlüssel, damit ich ihn freigeben kann?Verweise auf den in GHashTable gespeicherten Schlüssel

EDIT: Ich dachte über die Verwendung g_hash_table_new_full aber meine Verwendung von GHashTable ist so klein, dass ich diesen Overkill dachte. Ich würde es vorziehen, den Schlüssel manuell freizugeben.

EDIT: Wie von Keine Lust gezeigt g_hash_table_new_full sollte nicht weniger performant sein. Sie können auch NULL für eine der Zerstörungsfunktionen übergeben, wenn Sie sie nicht benötigen.

+0

Bitte geben Sie einen Grund für das Downvoting, danke. – timakro

Antwort

2

Ein einfacher Weg, die zugeordneten Daten zu free, wenn ein Eintrag in der Hash-Tabelle gelöscht wird eine free Funktion g_hash_table_new_full läuft:

GHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); 

Parameter

hash_func: eine Funktion zum Erstellen eines Hash-Wertes aus einem Schlüssel

key_equal_func: eine Funktion zwei Tasten für die Gleichstellung überprüfen

key_destroy_func: eine Funktion, um den Speicher für den Schlüssel verwendet, wenn das Entfernen des Eintrags aus dem GHashTable oder NULL zugewiesen zu befreien, wenn Sie nicht tun wollen um eine solche Funktion zu liefern.

value_destroy_func: eine Funktion, um den Speicher für den Wert verwendet zugewiesen befreien, wenn Sie den Eintrag aus der GHashTable entfernen oder NULL, wenn Sie nicht über eine solche Funktion liefern wollen.

+0

Ich überlegte, 'g_hash_table_new_full' zu verwenden, aber meine Verwendung von GHashTable ist so klein, dass ich diesen Overkill in Betracht zog. Ich würde es vorziehen, den Schlüssel manuell freizugeben. – timakro

+0

Mach dir keine Sorgen, es gibt keinen Overkill bei der Verwendung von 'g_hash_table_new_full', es füllt nur 2 Mitglieder in der Basisstruktur:' hash_table-> key_destroy_func' und 'hash_table-> value_destroy_func', tatsächlich wird' g_hash_table_new' als 'implementiert zurück g_hash_table_new_full (hash_func, key_equal_func, NULL, NULL); ', hinter der Szene, werfen Sie einen Blick auf die Implementierung: https://git.gnome.org//browse/glib/tree/glib/ghash.c –

+1

Danke für Wenn ich das klar mache, gehe ich glücklich mit 'g_hash_table_new_full' dann. – timakro