Rueckgabewert: Ist das hier gefaehrlich?
-
Hallo,
ich habe gerade folgenden Code gefunden:
char* Helper::getFileName(std::string str) { QString file(str.c_str()); QFileInfo fi(file); return fi.fileName().toLatin1().data(); }
Ist dieser Code nicht gefaehrlich? Der zurueckgegebene Zeiger zeigt doch auf einen Speicherbereich in "fi", das es nach Verlassen der Methode nicht mehr gibt, oder?
-
doch, da du nah dem Funktionsaufruf ins Nirvana zeigst.
-
Und der Dateiname wird per Value übergeben.
Der Author ist unter Garantie icht der hellste Stern am C++-Himmel.Obwohl das Snippet eine hohe Tendenz hat trotzdem zu funktionieren, solange der Pointer sofort und einmalig beutzt wird. Trotzdem natürlich fieses UB ud ein Programmierfehler.
-
Ändern zu:
std::string Helper::getFileName(std::string str) { QString file(str.c_str()); QFileInfo fi(file); return std::string(fi.fileName().toLatin1()); }
Problem gelöst.
-
oder so
std::string Helper::getFileName(const std::string& str) { QFileInfo fileInfo(QString::fromStdString(str)); return std::string(fileInfo.fileName().toLatin1()); }
Wobei ich mich frage was dieses toLatin1 hier soll.
Das geht dann auch.std::string Helper::getFileName(const std::string& str) { return QFileInfo(QString::fromStdString(str)).fileName().toStdString(); }
Die Funktion trennt letzendlich nur den Filenamen vom vorangegengenen Pfad. Das kann man auch ganz ohne Qt lösen.
-
Man nutzt schon Qt, warum dann nicht auch den QString verwenden?
QString Helper::getFileName(const QString& str) { return QFileInfo( str ).fileName(); }