- Registriert
- 3 Aug. 2014
- Beiträge
- 28.573
Hallo,
ich habe gerade etwas Code mit Valkyrie (/Valgrind Frontend) und den "gcc" Compilger Flags "-Ox -g" überprüft und kann gerade nicht nachvollziehen, warum eine bestimmte Code Zeile Memory Leaked.
Folgender Fehler:
4 bytes in 1 blocks are definitely lost in loss record 1 of X
Ich habe eine Struktur mit einem Char-Pointer >char *name<, diese hier, ein Auszug:
[src=c]typedef struct xmlNode {
void *lastAddedElement;
char *name; // <--- um den Namen geht es indirekt!
struct keyValuePair *keyValues;
} xmlNode;[/src]
Jetzt habe ich eine Funktion die einen XML Knoten Zeichenweise in ein statisches Char Array >readData< einliest welches jedoch jeweils nur einen eingelesen Wert enthält den Namen, den Schlüssel bzw. den Wert des Schlüssels.
ReadData wurde, für die ganzen Funktion global, so definiert:
[src=c]char readData[1024];[/src]
Nachdem der Wert eingelesen ist setzte ich an dem "Endpunkt" des Wortes das Null Zeichen und verarbeite das "readData" wie folgt:
Und dabei hebe ich mal die Stelle vor, die ich so nicht verstehe:
[src=c]if (writerPos != 0) {
readData[writerPos] = '\0'; // Hier wird schon explizit gesetzt....
if (!xmlHasName) {
xmlTag->name = malloc(sizeof(char) * (writerPos + 1)); // Diese Zeile wirft das Memory Leak laut Valgrind/Valkyrie
strcpy(xmlTag->name, readData); // bzw. hier.
xmlHasName = true;
} else if (isKey) {
//....
xmlKeyValue->key = malloc(sizeof(char) * (writerPos + 1)); // Wirft kein Leak, auch ohne Umweg
strcpy(xmlKeyValue->key, readData);
//....
isKey = false;
isValue = true;
} else if (isValue) {
xmlKeyValue->value = malloc(sizeof(char) * (writerPos + 1)); // Wirft auch kein Leak, auch ohne den Umweg
strcpy(xmlKeyValue->value, readData);
isValue = false;
}
readData[0] = '\0'; // <-- Ohne diese Stelle bekomme ich ein Memory Leak bei xmlTag->name = malloc....
writerPos = 0;
}[/src]
Und jetzt die Frage/Problem dazu, es wirft ausschließlich der >char* name< mit Malloc und Null-Platzhalter ein Leak, obwohl ich das gleiche mache wie auch für die anderen Werte, Schlüssel/Wert.
Bei letzterem bekomme ich keine Meldung über Speicheraustritt, nur der Name des XML Tags macht komischerweise Probleme* und das ist der erste Wert der gesetzt wird.
Warum bekomme ich diesen nicht, wenn ich explizit >readData[0] = '\0'< setze?
ich habe gerade etwas Code mit Valkyrie (/Valgrind Frontend) und den "gcc" Compilger Flags "-Ox -g" überprüft und kann gerade nicht nachvollziehen, warum eine bestimmte Code Zeile Memory Leaked.
Folgender Fehler:
4 bytes in 1 blocks are definitely lost in loss record 1 of X
Ich habe eine Struktur mit einem Char-Pointer >char *name<, diese hier, ein Auszug:
[src=c]typedef struct xmlNode {
void *lastAddedElement;
char *name; // <--- um den Namen geht es indirekt!
struct keyValuePair *keyValues;
} xmlNode;[/src]
Jetzt habe ich eine Funktion die einen XML Knoten Zeichenweise in ein statisches Char Array >readData< einliest welches jedoch jeweils nur einen eingelesen Wert enthält den Namen, den Schlüssel bzw. den Wert des Schlüssels.
ReadData wurde, für die ganzen Funktion global, so definiert:
[src=c]char readData[1024];[/src]
Nachdem der Wert eingelesen ist setzte ich an dem "Endpunkt" des Wortes das Null Zeichen und verarbeite das "readData" wie folgt:
Und dabei hebe ich mal die Stelle vor, die ich so nicht verstehe:
[src=c]if (writerPos != 0) {
readData[writerPos] = '\0'; // Hier wird schon explizit gesetzt....
if (!xmlHasName) {
xmlTag->name = malloc(sizeof(char) * (writerPos + 1)); // Diese Zeile wirft das Memory Leak laut Valgrind/Valkyrie
strcpy(xmlTag->name, readData); // bzw. hier.
xmlHasName = true;
} else if (isKey) {
//....
xmlKeyValue->key = malloc(sizeof(char) * (writerPos + 1)); // Wirft kein Leak, auch ohne Umweg
strcpy(xmlKeyValue->key, readData);
//....
isKey = false;
isValue = true;
} else if (isValue) {
xmlKeyValue->value = malloc(sizeof(char) * (writerPos + 1)); // Wirft auch kein Leak, auch ohne den Umweg
strcpy(xmlKeyValue->value, readData);
isValue = false;
}
readData[0] = '\0'; // <-- Ohne diese Stelle bekomme ich ein Memory Leak bei xmlTag->name = malloc....
writerPos = 0;
}[/src]
Und jetzt die Frage/Problem dazu, es wirft ausschließlich der >char* name< mit Malloc und Null-Platzhalter ein Leak, obwohl ich das gleiche mache wie auch für die anderen Werte, Schlüssel/Wert.
Bei letzterem bekomme ich keine Meldung über Speicheraustritt, nur der Name des XML Tags macht komischerweise Probleme* und das ist der erste Wert der gesetzt wird.
Warum bekomme ich diesen nicht, wenn ich explizit >readData[0] = '\0'< setze?
Zuletzt bearbeitet: