Malloc Anruf auf delete [] als Speicherleck in Totalview zeigt nach oben
-
21-09-2019 - |
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;
}
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