Streng genommen sollte Ihr String-Literal ein const char *
sein, da es undefiniertes Verhalten ist, einen Zeiger auf ein String-Literal zu ändern. So dass es konstant ist in C nicht erforderlich, aber dies wäre richtiger:
g_autofree char *foo = NULL;
const char *bar = "Hello";
foo = g_strconcat(bar, "there", NULL);
Wenn Sie die Regel internalisieren immer geben Hinweise auf Stringliterale einen const char *
Typ und nie frei const char *
Variablen, dann wird der obige Code wird schließlich instinktiv weniger falsch aussehen.
Für den allgemeinen Fall gibt es keine bessere Antwort als "überschreiben Sie keinen Heap zugewiesenen Zeiger, es sei denn, Sie haben es freigegeben." Wenn man genügend Erfahrung mit dem Schreiben von C hat, wird es instinktiv falsch aussehen.
Sie können [valgrind] (http://valgrind.org/) verwenden, um Speicherlecks zu erkennen. – 3kt
Zeichenfolgenliterale werden nicht im dynamischen/Heap-Speicher gespeichert. Daher kann es nicht freigegeben werden (außer wenn die gesamte Anwendung beendet wird) und daher kein Speicherleck vorhanden ist. – kaylum
Sie haben einen Speicherverlust, wenn Sie den Code eingeben: 'foo = g_strconcat (Zeile," da ", NULL)' 'foo = g_strconcat (Zeile," ist ", NULL)' Sie erstellen/Zuordnung '" ist "' ohne Aufruf 'g_free', um die vorher zugewiesenen' '' '' – LPs