Programm 'frisst' speicher!



  • Hallo!

    erstmal schickes redesign, ich bin echt positiv überrascht worden 🙂

    ich hab ein kleines chat programm geschrieben und bin jetzt auf das problem gestossen das das programm immer mehr speicher braucht. (das programm ist in c/winapi geschrieben)

    ich habe alle mallocs überprüft, aber es wird nirgends (mehr) speicher durch malloc angefordert, jedoch verbraucht das programm laut taskmanager immer mehr speicher.

    es wird andscheinend immer neuer speicher angefordert wenn das chatprogramm daten übers netz empfängt, allerdings wird kein malloc aufgerufen. woher könnte denn der mehrverbrauch kommen? (ca. 4kb/sec -> 15 mb / stunde)

    jemand vllt eine idee woran das liegen könnte (hab ich was in den docs zur winapi überlesen?)?

    gruss,

    matthias



  • Wie funktioniert dein Netzwerk Datentransfer (WinSock oder so). Vergißt du vielleicht den Empfangsbuffer zu leeren?



  • per udp broadcast mit statischem puffer... das sollte eigentlich stimmen

    int net_Receive(void){ //executet if data is aviabla at the udp socket (received)
    	int bytes,rmlen; 
    	char buf[4096];
    	char cmd[10];
    	char data[4096];
    	SOCKADDR_IN  rmaddr;  
    	rmlen = sizeof(rmaddr);
    	bytes=recvfrom(wsock,buf,4096,0, (struct sockaddr *) &rmaddr,&rmlen);
    [... ganz viele if's]
    }
    


  • ja, daran liegts auch nicht... es liegt an dem hier, ich versteh aber nicht worans liegt, weil hier wird eigentlich auch kein neuer speicher angefordert...
    es ist aber definitiv in der methode...

    kann es sein das dwParam1 einen neuen speicherbereich angibt?

    die methode ist die callback methode für eine aufnahme (wird so initialisiert:)
    waveInOpen(&hWaveIn,WAVE_MAPPER,&waveFormat,(DWORD)&audio_waveInProc,0L, CALLBACK_FUNCTION);

    achja und die puffer wurden schon alle richtig initialisiert... es funktioniert auch, nur eben wird immer mehr speicher verbraucht... 😕
    nicht wundern, das ganze is etwas chaotisch 🙂

    void CALLBACK audio_waveInProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2){
    	WAVEHDR* wavehdr;
    	int i;
    //	unsigned long sum=0;
    	int cur;
    	switch (uMsg){
    		case WIM_CLOSE: 
      		break;
    
    		case WIM_DATA:
    			if (audio_initialized){
    				wavehdr=((WAVEHDR*)dwParam1);
    /*				for(i=0;i<4096;i++){	//silence detection, currently not very good, but works :-)
    					cur=(((char*)wavehdr->lpData)[i]); //differenz von 128, also ausschlag von 0
    					if (cur<0)	//make positive
    						cur=(-1)*cur;
    					sum=sum+cur;
    				}
    				if (sum<520000) //grössere zahl=> leisere töne werden übertragen*/
    				audio_send(wavehdr->lpData); //send the data
    				wavehdr->dwFlags=0;
    				wavehdr->dwBytesRecorded=0;
    				if (waveInPrepareHeader(hWaveIn,wavehdr,sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
    					api_AddText("%s (%d)",__FILE__,__LINE__);
    				if (waveInAddBuffer(hWaveIn,wavehdr,sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
    					api_AddText("%s (%d)",__FILE__,__LINE__);
    
    			}else{
    				waveInClose(hWaveIn);
    			}
      		break;
    
    		case WIM_OPEN:
      		break;
    	}
    }
    


  • Bist du sicher, dass alle evtl. geöffneten Handles auch wieder geschlossen werden?



  • wenn ich waveInPrepareHeader und waveInAddBuffer auskommentier hab ich das problem nicht... und ich öffne sonst keine handles... wenn ich audio_send() auskommentier ändert das auch nichts, also muss es an den beiden aufrufen liegen, bzw. an dem nicht freigeben der puffer... aber warum muss ich die freigeben? (bzw. wie geb ich die richtig frei..??)



  • ups..blöder "fehler"... ich habs allein gefunden... 🙂
    einfach das rauslöschen dann passts:

    wavehdr->dwFlags=0; 
                    if (waveInPrepareHeader(hWaveIn,wavehdr,sizeof(WAVEHDR))!=MMSYSERR_NOERROR) 
                        api_AddText("%s (%d)",__FILE__,__LINE__);
    

    trotzdem danke für die hilfe!


Anmelden zum Antworten