Speicherfreigabe mit "delete"



  • Hi zusammen!

    Habe folgende Frage zur Speicherfreigabe mit "delete":

    Wenn ich mir innerhalb einer Funktion Speicher mit "new" beschafft habe, den dazugehörigen Zeiger dann wieder an den Aufrufer zurückgebe, wie gebe ich dann den in der Funktion beschafften Speicher z.B. in main() wieder frei?

    Bsp: Duplizieren eines C-strings. Funktion bekommt Zeiger auf C-String übergeben und liefert Zeiger auf duplizierten C-String zurück.

    char* strduplikat(const char* s)
    {
    	char* pdupl = new char[strlen(s)+1];
    	char* temp = pdupl;
    	while(*temp++ = *s++); // String elementweise kopieren
    
    	return pdupl;
    }
    

    Aufruf der Funktion:

    char* outputstr = strduplikat(inputstr);
    

    Über den Namen "pdupl" komme ich an den Speicher natürlich nicht mehr ran.

    delete [] outputsr;
    

    führt zu Fehlermeldung.

    Wie funktioniert das also?

    Danke im voraus!



  • benutz ganz einfach std::string!



  • Mußte am besten Smart-Pointer benutzen, die das autom. erledigen. Im ISO C++ ist zur Zeit ein Smartpointer vorhanden: auto_ptr.

    shared_ptr aus Boost wird im nächsten C++ Standard rein kommen.

    Ich hatte mal ein Tutorial zu auto_ptr geschrieben:
    http://www.kharchi.de/auto_ptr.html

    Falls du dir Mühe machen willst (die sich lohnt) würde ich mir auf jeden Fall shared_ptr von Boost anschauen und auch benutzen.



  • otze schrieb:

    benutz ganz einfach std::string!

    Sowieso! 🙂 Aber er hat dann immer noch das Factory-Problem.


  • Mod

    weder auto_ptr noch shared_ptr dürfen hier verwendet werden, denn es handelt sich um ein array.

    bleibt noch boost::shared_array wenn man keinen zusätzlichen aufwand betreiben will.

    dein delete [] ... muss eigentlich funktionieren, ausserdem ist

    while(*temp++ = *s++); // String elementweise kopieren
    

    nicht so gut wie

    strcpy( pdupl, s );
    

    oder

    size_t size = strlen( s ) + 1;
        char* pdupl = new char[ size ];
        memcpy( pdubpl, s, size );
    


  • Nanuq schrieb:

    delete [] outputsr;
    

    führt zu Fehlermeldung.

    Sollte nicht (abgesehen vom Tippfehler).



  • Danke für die Tipps!

    delete [] outputstr;
    

    fuktioniert tatsächlich. Da war wohl woanders der Wurm drin.

    Ringding schrieb:

    Sollte nicht (abgesehen vom Tippfehler)

    Ooops! Naja, der war's jedenfalls nicht. Den hätte mir der Compiler dann schon um die Ohren gehauen 🙂


Anmelden zum Antworten