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();
    }
    

Log in to reply