Lebenszeit von string::c_str()



  • Hallo zusammen,

    wie lange lebt eigentlich der von std::string::c_str() zurückgegeben Zeiger und wie lange darf er benutzt werden? return erzeugt ja eine (möglicherweise wegoptimierte) Kopie des Rückgabewerts, aber das ist in diesem Fall ja nur der Zeiger und nicht der Speicherbereich, auf den der Zeiger zeigt. Oder gibt es für const char* einen Sonderfall?

    const char* func()
    {
       std::string s = "Hello World";
       return s.c_str();
    }
    
    int main()
    {
       const char* res = func();
    }
    


  • So lange wie s lebt. Warum sollte das hier anders sein, als bei irgendeinem anderen Zeiger in einem anderen Objekt, was die Speicherverwaltung übernimmt?



  • Der c-string bleibt solange gültig bis der std::string zerstört wird oder eine seiner non-const Memberfunktion aufgerufen wird.



  • genau dieses Beispiel oben ist unzulaessig. Der std::string wird beim Verlassen der Funtion zerstoert und damit der pointer ungueltig.



  • DarkShadow44 schrieb:

    Der c-string bleibt solange gültig bis der std::string zerstört wird oder eine seiner non-const Memberfunktion aufgerufen wird.

    So ist es. Die übliche Verwendung von std::string::c_str() bei temporären Objekten à la

    std::FILE* file = std::fopen((filename + ".png").c_str(), "wb");
    

    funktioniert, weil temporäre Objekte bis zum Abschluß des Statements leben; es wird erst fopen() aufgerufen, dann das temporäre Objekt zerstört.



  • DarkShadow44 schrieb:

    So lange wie s lebt.

    Nein. Die Doku sagt:
    "The pointer returned may be invalidated by further calls to other member functions that modify the object." Wenn man den String ueber seine aktuelle capacity verlaengert, wird der pointer auf jeden Fall ungueltig.


  • Mod

    TGGC schrieb:

    <del>DarkShadow44</del>Jockelx schrieb:

    So lange wie s lebt.

    FTFY



  • TGGC schrieb:

    DarkShadow44 schrieb:

    So lange wie s lebt.

    Nein.

    Ja, bin nur darauf eingegangen, warum der Pointer hier auf wundersame Weise länger als s leben sollte.
    Hätte ein 'höchstens' einfügen sollen.


Anmelden zum Antworten