Problem mit malloc() und free()
-
Hallo,
Ich bin nicht sicher ob das ins C oder ins WinApi Forum gehört, da die Anwendung aber mit WinApi Fenster erstellt und WinSock nutzt, poste ich es hier.
Also ich will eine Datei übertragen. Das funktioniert auch halbwegs, aber es werden immer nur 4 Byte übertragen. Da sizeof() für den resevierten Speicherbereich der Datei immer 4 Byte anzeigt, glaube ich das es an malloc liegt. Es scheint so als würde malloc irgendwie immer nur 4Byte reservieren, egal was für einen Zahlenwert ich übergebe. Wie kann das sein?
while(!i->close) { FD_ZERO(&fdset); FD_SET(i->socket,&fdset); select(0,&fdset,0,0,const_cast<timeval*>(&time)); //Überprüfen ob Daten zu empfangen sind, if(FD_ISSET(i->socket, &fdset)) //wenn ja ist in fdset das Socket noch vorhanden { recv(i->socket,empf_daten,255,0); //Dateigröße empfangen size = atoi(empf_daten); //Dateigröße in int Wert umwandeln sprintf(empf_daten,"Size: %i",size); MessageBox(0,empf_daten,0,0); //Dateigröße ausgeben recv(i->socket,empf_daten,255,0); //Dateiname empfangen filename_short = empf_daten; //Dateiname speichern char* datei = (char*) malloc(size); //Speicher für die zu übertragende Datei resevieren, der größe der Datei entsprechend recv(i->socket,datei,size,0); //Datei empfangen filename = ""; //Vollen Dateipfad zum speichern erzeugen filename.append(i->recvPfad); // "-" filename.append(filename_short); // "-" SaveFile(filename,datei); //Datei speichern free(datei); //Speicher mit empfangener Datei wieder freigeben } if(!i->filenames.empty()) //Überprüfen ob Daten zu senden sind { filename = i->filenames.front(); //Ersten Dateinamen herausfinden i->filenames.pop_front(); //und aus der "zu senden Schlange" löschen size = getFileSize(filename); //Dateigröße für die zu sende Datei herausfinden sprintf(send_daten,"%i",size); //Dateigröße in Integerwert umwandeln send(i->socket,send_daten,255,0); //Dateigröße senden filename_short = GetBaseName(filename); //Pfadangaben herausfiltern strcpy(send_daten, filename_short.c_str()); //String in CString kopieren send(i->socket,send_daten,255,0); //Dateinamen übertragen char* datei = (char*) malloc(size); //Speicher für die zu übertragende Datei resevieren, der größe der Datei entsprechend sprintf(debug_buf, "Size des senders: %i", sizeof(datei)); MessageBox(0,debug_buf,0,0); LoadFile(filename, datei); //Datei in das char Array laden send(i->socket,datei,size,0); //Datei senden free(datei); //Speicher wieder freigeben; } }
-
malloc gibt dir einen pointer zurück und die grösse eines pointers ist auf deinem system 4 bytes;
Kurt
-
Bei recv() unbedingt den Rückgabewert prüfen!
Wenn man recv(socket,buffer,100,0) aufruft, sind nicht notwendigerweise auch 100 Bytes in buffer gelandet. Möglicherweise muss recv() mehrmals aufgerufen werden bis man insgesamt 100 Bytes eingelesen hat.
-
jetzt gehts, thk
Könnte mir nochmal einer sagen wieviel speicher man maximal mit malloc() reservieren kann?
-
wird das char, in dem recv die daten speichert, wenn ich mehrmals recv aufrufe gelöscht oder wird das neu empfangende immer angehängt.
-
der buffer wird überschrieben

Ich glaub malloc() kann soviel Speicher reservieren wie virtueller Arbeitsspeicher für die Anwendung da ist.
-
und wieviel sind das so im durchschnitt?
-
4GB
Abzüglich dessen, was durch das OS geschluckt wird...
PS: Im flat mode