[risolto][c] Domanda su free
[risolto][c] Domanda su free
Per dallocare una struttura creata tramite malloc è necessario utilizzare il puntatore che viene prodotto da malloc?
In altre parole se passo il puntatore per valore mi viene creata una copia e non posso utilizzarla per deallocare l'area di memoria giusto? In qesti casi il puntatore va sempre passato per riferimento, non esiste un modo per liberare la memoria con un altro puntatore? Conoscete qualche bel tool facile da usare per fare il debug di malloc e evitare memory leak?
Ringrazio in anticipo per la domanda forse banale, ma meglio che mi levo subito il dubbio :-[
In altre parole se passo il puntatore per valore mi viene creata una copia e non posso utilizzarla per deallocare l'area di memoria giusto? In qesti casi il puntatore va sempre passato per riferimento, non esiste un modo per liberare la memoria con un altro puntatore? Conoscete qualche bel tool facile da usare per fare il debug di malloc e evitare memory leak?
Ringrazio in anticipo per la domanda forse banale, ma meglio che mi levo subito il dubbio :-[
Ultima modifica di jack84 il martedì 29 aprile 2008, 13:12, modificato 1 volta in totale.
Non sempre si può prevedere, ma ci si può sempre preparare
-
SuperAxel
- Prode Principiante
- Messaggi: 113
- Iscrizione: mercoledì 8 marzo 2006, 17:25
- Località: Minturno
Re: [c] Domanda su free
esattamente.
per deallocare la memoria in c, devi usare il puntatore restituito con malloc.
per deallocare la memoria in c, devi usare il puntatore restituito con malloc.
-
wally67
- Scoppiettante Seguace

- Messaggi: 699
- Iscrizione: giovedì 1 marzo 2007, 15:31
- Distribuzione: xubuntu 20.04 LTS x86_64 (l'unica)
Re: [c] Domanda su free
??? ??? ???
e questo per farti capire che sei stato veramente incasinato :P
detto cio': una malloc restituisce il puntatore alla 1ma locazione dell' area di memoria richiesta. il puntatore e' un puntatore (proprieta' riflessiva :P forse!)
se passi il puntatore ad una funzione F questo ti viene passato per valore, ma se all' interno di tale funzione F fai una free di questo valore ti libera VERAMENTE l' area allocata dalla malloc. l' inconveniente e' che se tu previdentemente hai messo dei controlli tipo fuori dalla funzione F, e dentro F (dopo la free) hai messo il puntatore a NULL, una volta uscito da F ti ritrovo con un puntatore "sporco" su cui il controllo precedente non funziona piu'
non so se mi sono capito...
per l' ultima domanda... no.
wally 67 (e sono tanti)
e questo per farti capire che sei stato veramente incasinato :P
detto cio': una malloc restituisce il puntatore alla 1ma locazione dell' area di memoria richiesta. il puntatore e' un puntatore (proprieta' riflessiva :P forse!)
se passi il puntatore ad una funzione F questo ti viene passato per valore, ma se all' interno di tale funzione F fai una free di questo valore ti libera VERAMENTE l' area allocata dalla malloc. l' inconveniente e' che se tu previdentemente hai messo dei controlli tipo
Codice: Seleziona tutto
if (pt != NULL) {...}non so se mi sono capito...
per l' ultima domanda... no.
wally 67 (e sono tanti)
Se io do una moneta a te e tu una a me abbiamo entrambi 1 moneta;
ma se io do una idea a te e tu una a me abbiamo entrambi 2 idee.
ma se io do una idea a te e tu una a me abbiamo entrambi 2 idee.
- ryuujin
- Entusiasta Emergente

- Messaggi: 1032
- Iscrizione: venerdì 14 aprile 2006, 2:57
- Sesso: Maschile
- Località: Pescara
- Contatti:
Re: [c] Domanda su free
ti consiglio valgrindjack84 ha scritto: Conoscete qualche bel tool facile da usare per fare il debug di malloc e evitare memory leak?
Poi ci sono memwatch e yamd, poco usati.
poi c'e' Electric Fence che consiste in una libreria che va linkata al progetto e sostituisce malloc e free con delle versioni ad hoc da usare per il debugging della memoria.
Poi ci sono anche altre librerie per il memory leakege detection, basta che fai una ricerca su google.
Comunque, bada che su linux, anche se non liberi tutti la memoria allocata, il kernel lo fara' per te alla chiusura del processo.
Ah, un altro modo per debuggare la memoria senza usare tool aggiuntivi e settare la variabile d'ambiente MALLOC_CHECK_ a 1. Ad esempio, se prog1 e' l'eseguibile su cui vuoi effettuare il controllo:
Codice: Seleziona tutto
MALLOC_CHECK_=1 ./prog1
Codice: Seleziona tutto
malloc: using debugging hooks
*****
free(): invalid pointer 0x80496d0
*****
free(): invalid pointer 0x80496d0
realloc(): invalid pointer 0x80496d0
malloc: top chunk is corrupt
*****
http://blog.spicydev.it
"Chi riceve un'idea da me, ricava conoscenza senza diminuire la mia; come chi accende la sua candela con la mia, riceve luce senza lasciarmi
al buio". - Thomas Jefferson
"Chi riceve un'idea da me, ricava conoscenza senza diminuire la mia; come chi accende la sua candela con la mia, riceve luce senza lasciarmi
al buio". - Thomas Jefferson
Re: [c] Domanda su free
Il punto è proprio questo. In pratica nel mio programma ho diverse volte allocato strutture tramite malloc e passato il puntatore per valore, quindi non il puntatore originario ma una copia(anche se punta alla stessa zona) e ho conservato questa. Il puntatore originario finita la funzione chiamante viene distrutto ma (meno maledetto cio': una malloc restituisce il puntatore alla 1ma locazione dell' area di memoria richiesta. il puntatore e' un puntatore (proprieta' riflessiva forse!)
se passi il puntatore ad una funzione F questo ti viene passato per valore, ma se all' interno di tale funzione F fai una free di questo valore ti libera VERAMENTE l' area allocata dalla malloc.
Ultima modifica di jack84 il martedì 29 aprile 2008, 10:54, modificato 1 volta in totale.
Non sempre si può prevedere, ma ci si può sempre preparare
-
wally67
- Scoppiettante Seguace

- Messaggi: 699
- Iscrizione: giovedì 1 marzo 2007, 15:31
- Distribuzione: xubuntu 20.04 LTS x86_64 (l'unica)
Re: [c] Domanda su free
che tu faccia free sul puntatore originario o sulla sua copia non cambia nulla: la free libera sempre l' area corretta
per quel che riguarda valgrind non ho la piu' pallida idea di come funziona ne' se funziona bene (e non dia quindi falsi positivi)
a me e' capitato una volta (taaaanto tempo fa) di scrivere un interprete che usava memoria dinamica e che si piantava dopo qualche iterazione. ho scoperto che il tutto era dovuto a delle malloc non compensate (mi sento vagamente neo in matrix reloaded :P) e ne sono venuto fuori individuando le free mancate tramite il controllo dei puntatori.
mi spiego: se nel 1mo giro ho pt1 = a, pt2 = b, pt3 = c e nel 2do giro ho pt1 = a, pt2 = b, pt3 = d significa che non ho liberato pt2 (tutto questo per il modo in cui funzionava il mio interprete)
questa spiegazione ti e' stata di aiuto? mi auguro di si
wally 67 (e sono tanti)
per quel che riguarda valgrind non ho la piu' pallida idea di come funziona ne' se funziona bene (e non dia quindi falsi positivi)
a me e' capitato una volta (taaaanto tempo fa) di scrivere un interprete che usava memoria dinamica e che si piantava dopo qualche iterazione. ho scoperto che il tutto era dovuto a delle malloc non compensate (mi sento vagamente neo in matrix reloaded :P) e ne sono venuto fuori individuando le free mancate tramite il controllo dei puntatori.
mi spiego: se nel 1mo giro ho pt1 = a, pt2 = b, pt3 = c e nel 2do giro ho pt1 = a, pt2 = b, pt3 = d significa che non ho liberato pt2 (tutto questo per il modo in cui funzionava il mio interprete)
questa spiegazione ti e' stata di aiuto? mi auguro di si
wally 67 (e sono tanti)
Se io do una moneta a te e tu una a me abbiamo entrambi 1 moneta;
ma se io do una idea a te e tu una a me abbiamo entrambi 2 idee.
ma se io do una idea a te e tu una a me abbiamo entrambi 2 idee.
Re: [c] Domanda su free
Sì ti ringrazio,era quello che volevo sentirmi dire, spero che mi capirete che quando succedono queste cose uno si fa venire i dubbi più impensatiche tu faccia free sul puntatore originario o sulla sua copia non cambia nulla: la free libera sempre l' area corretta
per quel che riguarda valgrind non ho la piu' pallida idea di come funziona ne' se funziona bene (e non dia quindi falsi positivi)
a me e' capitato una volta (taaaanto tempo fa) di scrivere un interprete che usava memoria dinamica e che si piantava dopo qualche iterazione. ho scoperto che il tutto era dovuto a delle malloc non compensate (mi sento vagamente neo in matrix reloaded Tongue) e ne sono venuto fuori individuando le free mancate tramite il controllo dei puntatori.
mi spiego: se nel 1mo giro ho pt1 = a, pt2 = b, pt3 = c e nel 2do giro ho pt1 = a, pt2 = b, pt3 = d significa che non ho liberato pt2 (tutto questo per il modo in cui funzionava il mio interprete)
questa spiegazione ti e' stata di aiuto? mi auguro di si
wally 67 (e sono tanti)
Non sempre si può prevedere, ma ci si può sempre preparare
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti