Zeiger zurückgeben



  • Hi,

    folgender Code:

    void myAlloc( void* myPtr, int size )
    {
        myPtr = new char[ size ];
        return( myPtr );
    }
    

    Dies führt zu ungewolltem Verhalten.
    Wenn ich hingegen
    [

    void myAlloc( void** myPtr, int size )
    {
        *myPtr = new char[ size ];
        return( *myPtr );
    }
    

    mache funktioniert es einwandfrei.
    Warum ist das so?
    Dynamischer Speicher ist doch nicht an eine Variable gebunden.
    Und am Ende der Funktion kann er ja auch nicht wieder vom Programm freigegeben werden, da dies die Aufgabe eines CabbageCollectors wäre und C++ ja bekantlich keinen hat.



  • Du machst ein return, obwohl Du void als Rückgabetypen definiert hast...



  • Im ersten Beispiel ist myPtr eine lokale Variable, die nur mit dem Inhalt des Parameters vorinitialisiert wird. Was du dort machst, hat keine Auswirkung auf die übergebene Variable (und das führt zu einem Speicherleck, weil niemand den Block freigibt). Im zweiten Beispiel ist myPtr zwar auch lokal, aber enthält die Adresse der externen Variablen - das heißt *myPtr ist die Variable des Hauptprogramms und an diese weist du die angeforderte Adresse zu.

    PS: daß eine void-Funktion nichts zurückgeben kann, hat Paddy ja schon erwähnt.



  • void *myAlloc(int size)
    {
        return (new char[size]);
    }
    

    Sollte funken.
    wobei du selbst siehst das deine funktion sinnlos ist wozu eine funktion schreiben die new benutzt um das gleiche zu machen was mit new geht oO

    mfg tobZel



  • CStoll schrieb:

    Im ersten Beispiel ist myPtr eine lokale Variable, die nur mit dem Inhalt des Parameters vorinitialisiert wird. Was du dort machst, hat keine Auswirkung auf die übergebene Variable (und das führt zu einem Speicherleck, weil niemand den Block freigibt).

    nö, das geht so, wie es da steht
    die funktion muss nur so definiert werden, dass sie den void* auch zurückgibt (wie Paddy82 geschrieben hat).
    🙂



  • @vista: Aber dann ist es auf jeden Fall sinnlos, dort schon einen 'void*' mitzugeben 😉 (die Funktion nutzt weder den übergebenen Wert noch kann sie über diesen Parameter die neue Adresse zurückgeben - und ich tippe jetzt blind darauf, daß Erika die Funktion in der Form void* data;myAlloc(data,size); verwenden wollte und sich über Zugriffsfehler gewundert hat)


Log in to reply