[risolto][c] Domanda su free

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

[risolto][c] Domanda su free

Messaggio da jack84 »

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 :-[
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

Messaggio da SuperAxel »

esattamente.
per deallocare la memoria in c, devi usare il puntatore restituito con malloc.
wally67
Scoppiettante Seguace
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

Messaggio da wally67 »

??? ??? ???

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) {...}
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)
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.
Avatar utente
ryuujin
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1032
Iscrizione: venerdì 14 aprile 2006, 2:57
Sesso: Maschile
Località: Pescara
Contatti:

Re: [c] Domanda su free

Messaggio da ryuujin »

jack84 ha scritto: Conoscete qualche bel tool facile da usare per fare il debug di malloc e evitare memory leak?
ti consiglio valgrind :)

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
Un output solito puo' essere:

Codice: Seleziona tutto

malloc: using debugging hooks
*****
free(): invalid pointer 0x80496d0
*****
free(): invalid pointer 0x80496d0
realloc(): invalid pointer 0x80496d0
malloc: top chunk is corrupt
*****
r.
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
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: [c] Domanda su free

Messaggio da jack84 »

detto 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.
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 male ;D, come giuto che sia) l'area di memoria allocata no. Una volta che la struttura dati non mi serve più me la visito tramite i puntatori e provvedo a deallocare mano mano le aree di memoria tramite free, però i puntatori sono le copie. Pensavo si potesse fare tranquillamente ma stò usando valgrind per scovare memoria che non ho deallocato e su queste operazioni mi da che non ho deallocato la memoria, non conosco se il motivo è dovuto al fatto che tiene conto dei vecchi riferimenti, ma io provvedo a deallocare tramite gli altri oppure se è dovuto al fatto che per deallocare è necessario utilizzare i vecchi riferimenti. Un'altra possibilità è che mi perdo qualche puntatore, ma almeno vorrei escludere il mio primo dubbio
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
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

Messaggio da wally67 »

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)
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.
Avatar utente
jack84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 493
Iscrizione: lunedì 12 febbraio 2007, 11:13

Re: [c] Domanda su free

Messaggio da jack84 »

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 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)
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ù impensati :)  Ringrazio a tutti per le risposte, che sono al solito precise e puntuali, speriamo di non dovervi affligere ancora con i miei dubbi e speriamo che non sia anche io l'eletto delle malloc non compensate ;D
Non sempre si può prevedere, ma ci si può sempre preparare
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti