Speicherleichen nach return?



  • Was passiert eigentlich bei folgender Funktion, nach dem return? Wie wird der Speicher der durch new angelegt wird wieder freigegeben?
    Oder wird er das nicht, und durch jeden erneuten Aufruf von FloatToString entstehen mehr Speicherleichen? - Wenn ja wie mach ichs korrekt? Ich steh a bissal auf der Leitung...

    char* FloatToString(float fEingabe, int iPrecision)
    {	
    	ostringstream ossBuffer;
    	ossBuffer<<setprecision(iPrecision)<<fEingabe;
    	string sBuffer=ossBuffer.str();
    	char *cBuffer = new char[sBuffer.length()];
    	StringCchCopy(cBuffer, sBuffer.length(), sBuffer.c_str() );
    	cBuffer=sBuffer.c_str();
    	return cBuffer;
    }
    


  • jedes new braucht auch ein delete, in diesem Fall müsste
    sich der aufrufer der Funktion darum kümmern, aber
    woher soll er wissen das du new benutzt ?

    wieso gibst du nicht std::string zurück ?

    Devil



  • nein wird nicht freigegeben. richtig gehts mit delete[] cBuffer vor dem return oder einem std::vector.



  • delete [] cBuffer; vor dem return ist natürlich eine Schnapsidee.

    Möglichkeit 1: Du verwendest std::string statt char*
    Möglichkeit 2: Du lässt den User den String später deleten (sehr schlecht)
    Möglichkeit 3: Du lässt den User bereits den Speicher übergeben (in C-APIs sehr oft der Fall)

    MfG SideWinder



  • Das Speicherleck hast du schon hier:

    cBuffer=sBuffer.c_str();
    

    Hier überschreibst Du den Zeiger, den Du mit new erhalten hast, den Speicher kannst Du nie wieder freigeben.

    Lass die Funktion einen std::string zurückgeben. Alles andere ist fehleranfällig und umständlich.



  • Ok, std::string wäre gut. Aber trotzdem muss er den Speicher einmal dynamisch anlegen für den StringCchCopy Aufruf. Dann einen std::string mit dem cBuffer erstellt, und cBuffer wieder freigeben.



  • std::string FloatToString(float fEingabe, int iPrecision)
    {   
        ostringstream ossBuffer;
        ossBuffer << setprecision(iPrecision) << fEingabe;
        return ossBuffer.str();
    }
    


  • MFK schrieb:

    Das Speicherleck hast du schon hier:

    cBuffer=sBuffer.c_str();
    

    Hier überschreibst Du den Zeiger, den Du mit new erhalten hast, den Speicher kannst Du nie wieder freigeben.

    Lass die Funktion einen std::string zurückgeben. Alles andere ist fehleranfällig und umständlich.

    Du hast recht, dass ich natürlich absuluter schmarrn, wie das da rein gekommen ist weis ich nicht.



  • devil81 schrieb:

    jedes new braucht auch ein delete, in diesem Fall müsste
    sich der aufrufer der Funktion darum kümmern, aber
    woher soll er wissen das du new benutzt ?

    wieso gibst du nicht std::string zurück ?

    Devil

    std::string wollt ich vermeiden da ich nicht weiss wie die Dinger genau aufgebaut sind. Diese string Klassen sind ma irgendwie suspekt, muß mich mal mit denen auseinandersetzen.



  • ewitt7u0 schrieb:

    std::string wollt ich vermeiden da ich nicht weiss wie die Dinger genau aufgebaut sind.

    Aber stringstreams verwendest du? 😕



  • Verwenden schon, wissen wie sie genau funktionieren nicht. 😉
    Aber ich verwende jetzt ohnehin auch die strings.
    Danke für die prompte Hilfe.


Log in to reply