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?



  • @geeky:

    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


Anmelden zum Antworten