Memory leak?

09/08/2012 12:34 Trollface-#1
Hi,

kommen wir direkt zur sache.

Ich habe eine Client Struktur und eine Serverklasse,
in der Serverklasse habe ich die Client Struktur deklariert.

Code:
Clients Client[255];
Nun läuft eine Schleife die auf Clients wartet, sollte ein Client akzeptiert werden wird ein Thread aufgerufen, dabei startet es eine Funktion meiner Recv Klasse und übergibt die Client Variable als Parameter.

Code:
CreateThread(NULL, NULL, &TRecv::Data, &this->Client[i], NULL, NULL);
So nun bei meinen Thread habe ich nen Pointer deklariert und anschließend den Parameter gecastet.

Code:
DWORD WINAPI TRecv::Data(LPVOID param)
{
          Clients *my_client = (Clients*)param;

          while(1) 
          {
              //überprüfen ob Daten zum empfangen vorhanden, etc...
          }
}
So nun zu meiner Frage,
muss das my_client wieder freigegeben werden?
Es wurde ja kein Objekt mit new erstellt.
Stehe gerade etwas auf dem Schlauch.

Möchte ungerne ein Memory leak später im Programm haben,
da es etwas größeres werden soll.

Freue mich auf eine Antwort.

mfg Trollface-
09/08/2012 13:13 MrSm!th#2
Wenn myclient nicht mit new alloziert wurde, kann er auch nicht mit delete freigegeben werden.

malloc -> free
new -> delete
nichts -> nichts

Letzteres ist bei dir der Fall, die Client Variable ist entweder auf dem Stack oder global (es ist nicht ersichtlich, ob du die Variable lokal erstellst oder sie global ist).
Im Falle, dass sie auf dem Stack liegt, musst du aber darauf achten, dass der Stack ein temporärer Speicher ist.
Wenn die Funktion, die das Objekt erstellt hat, returned und dann andere Dinge mit dem Stack geschehen, wird es überschrieben. Deshalb gibt man aus einer Funktion nie Pointer auf lokale Variablen zurück und erst recht nicht an andere Threads.
09/08/2012 13:33 Trollface-#3
Quote:
Originally Posted by MrSm!th View Post
Wenn myclient nicht mit new alloziert wurde, kann er auch nicht mit delete freigegeben werden.

malloc -> free
new -> delete
nichts -> nichts

Letzteres ist bei dir der Fall, die Client Variable ist entweder auf dem Stack oder global (es ist nicht ersichtlich, ob du die Variable lokal erstellst oder sie global ist).
Im Falle, dass sie auf dem Stack liegt, musst du aber darauf achten, dass der Stack ein temporärer Speicher ist.
Wenn die Funktion, die das Objekt erstellt hat, returned und dann andere Dinge mit dem Stack geschehen, wird es überschrieben. Deshalb gibt man aus einer Funktion nie Pointer auf lokale Variablen zurück und erst recht nicht an andere Threads.
Super erklärt, vielen dank.
Damit hat es sich hier erledigt und kann geschlossen werden. :)
09/08/2012 15:19 MrSm!th#4
#closed