Frage

Ich HDF5 bin mit einem String in ein char* von new[] zugewiesen zu lesen. Ich benutze dann einen String :: assign () Aufruf, um diese Daten zu kopieren, wo ich will es wirklich. Ich rufe dann delete[] an diesem char *. Dies zeigt sich als Quelle für ein Speicherleck mit Totalview. Es zeigt Anrufe in stdlibc ++ unter delete[] zu replace_safe, mutate, create verstümmelt, dann malloc. Was ist los, und das ist wirklich ein Speicherleck? Ich habe Set GLIBCXX_FORCE_NEW=1 auch hier.

Es folgt ein Beispielcode, der die Situation dupliziert. Beachten Sie, dass valgrind zeigt keine Lecks, und wenn ich nicht einen Haltepunkt vor dem cout Ruf bringt, gibt es kein Leck von Totalview gefunden.

#include <string>
#include <iostream>
#include <cstdlib>

int main()
{
    std::string str;

    int len = strlen(getenv("PATH"));
    char* x = new char[len + 1];
    strcpy(x, getenv("PATH"));
    x[len] = '\0';

    str.assign(x);

    delete[] x;

    std::cout << str << std::endl;
}
War es hilfreich?

Lösung

Es sollte in Ordnung sein:
Aber ich würde vorschlagen, std :: vector mit eher als Newing ein Array von char:

std::vector<char>  x(len+1);
strcpy(&x[0], getenv("PATH"));

Der Grund, warum ich dies tun würde, ist, dass die Methode assign () möglicherweise eine Ausnahme auslösen kann. Als solche sind der Lösch genannt werden kann nicht und so konnte man in Gegenwart einer Ausnahme austreten. Verwendung des Vektors grantee Sie die Speicher wegen RAII gereinigt wird.

Andere Tipps

Nicht auf das Leck verwandt, aber wenn Sie die Länge bevorzugt strncpy über strcpy wissen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top