Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C++] Gestione memoria

  1. #1

    [C++] Gestione memoria

    Ciao a tutti,
    ho semplice programma (leggi/scrivi) che va a gestire file di diversi giga.
    Mi sono preoccupato di allocare sempre il minimo della memoria necessaria ad ogni stringa che vado ad utilizzare e di liberarne sempre lo spazio allocato. Nonostante questo la memoria continua ad aumentare velocemente fino ad arrivare al limite dei 2gb se scrivo un file di circa 3gb.
    Mi rimangono quindi alcuni dubbi sull'utilizzo della memoria.
    - Oltre a malloc/free che attualmente utilizzo solo su stringhe o su un paio di piccole typedef, devo prendere altre accorgimenti per mantenere bassa la memoria utilizzata?
    - Come faccio a liberare la memoria utilizzata da una variabile che deve restituirmi il valore di una funzione? Per esempio...
    codice:
    char* AsciiToHex(char* sAscii,int Lunghezza)
    {
    	char *StringaEsadecimale, *Hex;
    	int i;
    
    	StringaEsadecimale=(char*)malloc(Lunghezza*2+1);
    	StringaEsadecimale[0]='\0';
    	Hex=(char*)malloc(sizeof(char)*1);
    	for(i=0;i<Lunghezza;i++)
    	{
    		itoa((unsigned char)sAscii[i],Hex,16);
    		strcat(StringaEsadecimale,Hex);
    	}
    	return StringaEsadecimale;
    }
    ... come a liberare lo spazio allocato a cui punta StringaEsadecimale?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa la free sul puntatore restituito.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Come sempre grazie Oregon,
    la free sul puntatore restituito la faccio già...
    codice:
    TipoRecordHex=AsciiToHex(TipoRecord,3);
    ....
    free(TipoRecordHex);
    -----------------------------------
    In effetti la tua risposta sembra sensata, dal momento che restituisco il puntatore ad un'area di memoria, dovrei essere in grado di accedere a quest'area ed eventualmente a liberarla.
    Eppure ho appena fatto una prova, la funzione AsciiToHex l'ho commentata e portata nel main. In questo modo riesco a liberare la memoria puntata da StringaEsadecimale tramite free. Ora la memoria non sale + (almeno, sale molto meno). Ma non riesco a capire perchè...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se c'e' un memory leak, bisogna studiare TUTTO il codice per capirne la causa ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Se c'e' un memory leak, bisogna studiare TUTTO il codice per capirne la causa ...
    credo di aver capito, come al solito hai sempre ragione!

    Di fatto ho due puntatori:
    il primo (TipoRecordHex) nel main,
    il secondo è quello che ottengo dalla funzione AsciiToHex.
    Faccio le seguenti operazioni nell'ordine illustrato

    codice:
    TipoRecordHex=malloc....
    TipoRecordHex=AsciiToHex(...)   // qui è l'errore
    
    char* AsciiToHex(...)
    {
      return Puntatore
    }
    free (TipoRecordHex);
    dopo aver assegnato un indirizzo a TipoRecordHex tramite la malloc, vado a perdere quest'indirizzo nel passaggio successivo, rimpiazzandolo con quello ottenuto dalla funzione AsciiToHex. Quindi perdo il vecchio indirizzo di TipoRecordHex e rimane riservata un'area di memoria senza essere nemmeno utilizzata.
    Al posto di
    codice:
    TipoRecordHex=AsciiToHex(...);
    devo mettere
    codice:
    strcpy(TipoRecordHex,AsciiToHex(....));
    ciao e grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.