kurze frage zur lebenszeit von objekten



  • folgende operator definition:

    fancyclass_t::operator const char*()
    {
    	std::ostringstream os;
    	os << 3.4568746;
    	return os.str().c_str();
    }
    

    und folgender code:

    int main()
    {
        fancyclass_t* source = new fancyclass_t();
        const char* test = *source;
        delete source;
        printf("data: %s\n", test);
        return 0;
    }
    

    gibt

    data: 3.45687
    

    aus.
    ich meine, ok, ostringstream.str() gibt eine kopie zurück. aber sollte die nicht auch nach dem operatoraufruf zerstört sein wenn "os" zerstört wurde? was mich wundert ist, dass ich selbst nach dem "delete source;" noch auf test zugreifen kann, zufall oder korrektes verhalten? ein memory leak gibt's gemäß valgrind nicht. oder ist es ganz einfach und brauche einfach nur mehr kaffee? 🙂



  • Du hast Glück gehabt. Der std::string, der von os.str() zurückgegeben wurde, hat sich Speicher besorgt und den mit den entsprechenden Zeichen belegt. Nach dem Aufruf des op wurde der String zerstört und der Speicher freigegeben (deshalb wird auch kein Speicherleck angezeigt). Nach der Zuweisung an test zeigt dieser also auf einen freigegebenen Speicherbereich wo allerdings immernoch die Zeichen drinstehen. Du kannst ja mal danach noch ein paar weitere Funktionen aufrufen die mit irgendwelchen lokalen Stringobjekten arbeiten - irgendwann wird dir das deinen Speicher überschreiben.



  • ah, alles klar. danke 🙂



  • wenn du solchen code im debug modus übersetzt, sollte der speicher eigendlich mit einem Speziellen Bitmuster (Vc8: 0xfeee oder so ähnlich) markiert werden um solche fehler zu vermeiden.


Anmelden zum Antworten