# [C++] calloc, speicher wieder freigeben



## Crayzee Ivan (9. August 2002)

Moin!

Ich hätte da mal ein Frage: Ich arbeite zur Zeit recht viel mit calloc, realloc usw, und ich weiß, das ich allozierten Speicher wieder freigeben sollte, wenn ich Leaks vermeiden will. Ich weiß auch das ich das mit der free()-Funktion mache.
Jetzt mein Problem: Ich habe eine Funktion, die intern ein variables (also mit den alloc-Funktionen gebasteltes) Array erstellt, und dies am Ende als Funktionsrückgabewert zurückgibt (also, einen Pointer auf das Array). Nur, nach dem return ist ja sense mit der Funktion, wie kann ich den Speicher dann wieder freigeben? Oder muss das gar nicht sein, da der Scope zu Ende ist? Oder reicht es, wenn ich den Pointer, der den Rückgabewert übernimmt "befreie"?

Gruß,
-Crayzee Ivan


----------



## goela (10. August 2002)

Wenn ich es richtig gelesen habe:

- Funktion erstellt dynamisches Array mit calloc
- Den Zeiger des dynamisch erzeugten Arrays gibt die Funktion zurück (arbeitest Du später weiter mit dem Array?)

Soweit richtig?

Grundsätzlich gilt: Der angeforderte Speicher muss wieder freigegeben werden. Sonst Memoryleaks!

Dies bedeutet, wenn Du das Array nicht mehr benötigst, dann musst Du es mit free (wo auch immer) wieder freigeben.

Der Speicher würde nur dann beim Verlassen des Scopes freigegeben werden, wenn Du Dein dynamisches Array als Objektklasse modelliert hättest und den Speicher, welchen Du angefordert hast im Destruktor wieder mit free freigegeben würdest -> Objekt wird zerstört!

Noch was: Wenn Du in rein in C++ programmierst wäre new und delete vorzuziehen!


----------



## Crayzee Ivan (11. August 2002)

Erst mal: ja, ich verwende das Array noch, aber halt nur über den übergebenen pointer. Macht das dann einen Unterschied, oder kann ich auch den übergebenen Pointer mit free benutzen?

Und zweitens, wie macht man das Ganze mit new und delete?
(hm, könnte natürlich auch mal ins manual gucken )

Schon mal danke für die Antwort 

-Crayzee Ivan


----------



## goela (12. August 2002)

Wo Du Deinen Speicher wieder freigibst macht keinen Unterschied -> Du hast ja den Zeiger zurückgegeben, spricht die Adresse "kopiert"!

So könnte die Funktion mit new und delete aussehen:

```
long* getarray(int size)
{
    long *buffer;

    buffer = new long[size];
    if( buffer != NULL )
        printf( "Allocated buffer\n" );
    else
        printf( "Can't allocate memory\n" );

    return (buffer);
}

int main(int argc, char* argv[])
{
    long* pArray = getarray(40);
    delete pArray;
}
```


----------



## Crayzee Ivan (12. August 2002)

Ok, danke!

Werd das gleich mal einbauen. Vielleicht läuft das Proggie dann besser 

-Crayzee Ivan


----------

