Newsgroup: it.comp.lang.c
Titolo: free() non dealloca

salve gente
vi pongo questo 'bel' problemino ...
vi e' mai capitato che la funzione free() non deallochi il puntatore che gli
do?
questo ovviamente influisce negativamente nel programma 
perchč dopo una serie di cicli che continuo ad allocare ....(SigSev)
avete idee in merito?
-- 
KiloByte
Community: 
www.freelabs.org
Powered by Debian GNU/linux

 do?
No.
Prima di incolpare la free, io guarderei il codice che hai scritto.

nessuna piattaforma e' perfetta..
anni fa, lavorando su un sistema real-time, riscontravo comportamenti
bizzarri.. alla fine, dopo molto cercare, ho scoperto che un device
driver andava a scrivere a intervalli regolari in un word della
interrupt vector table... avvertito il produttore che ha
prontamente fornito una versione corretta, applicazione nuovamente
funzionante.
..naturalmente si trattava di una piattaforma senza protezioni
di memoria.
Comunque, il primo passo e' sempre verificare il proprio codice.
Ciao.


> nessuna piattaforma e' perfetta..
Non escludo di incolpare la piattaforma, ma prima guarderei 3000 volte
il mio codice.


Detto questo non e' buona cosa allocare in un ciclo.... Invece di avere:
for(i=0;i<1000;++i){
    p = malloc(1000);
    // do something
    free(p);
}
conviene avere:
p =  malloc(1000);
for(i=0;i<1000;++i){
    // do something
}
free(p);
questo sempre che sia possibile!
Tommy

 p2 = (int*)malloc(1000);
mi scuso per il cast ma mi e' stato molto piu' comodo usare un compilatore
C++....
ovviamentre in C e':
p2 = malloc(1000);
Tommy

Gia' detto.
Roberto Nunnari wrote:
 > ... snip ...
 >
 > Comunque, il primo passo e' sempre verificare il proprio codice.
 >
 > Ciao.
 >

-- 
                Roberto Nunnari -software engineer-
                     mailto:
ro...@nunnisoft.ch
 
http://www.nunnisoft.ch
   Residenza Boschetto 12           tel/fax: 
+41-91-6046511
   6935 Bosco Luganese        """    mobile: 
+41-76-3208561
   Switzerland               (o o)
========================oOO==(_)==OOo========================

> Gia' detto.
Gradirei che evitassi di riportare quanto scrivo, se non per commenti
realmente intelligenti.

idem.


> idem.
*plonk*

 *plonk*


 avete idee in merito?
Non è che una zona di memoria, per essere disponibile, debba essere 
necessariamente vuota e non è detto che il puntatore, dopo una free(), 
punti necessariamente a NULL.
Scrivi almeno la riga di codice con la quale verifichi la non 
disponibilità della memoria liberata con free();
Marcello


Non č che, se lo scrivevi in C con il cast, sarebbe successo chissache'! ;)
Cmq, secondo me, hai centrato il problema.
Marcello

 avete idee in merito?
Una volta ho verificato che dopo aver dinamicamente allocato e riempito un
vettore di interi, dopo free il puntatore si riferiva ancora alla stessa
memoria, ma il contenuto di questa era variata:
OUTPUT:
&pv  = 12ff7c; pv  = 430150; *pv  = 1
&pv  = 12ff7c; pv  = 430150; *pv  = -572662307 (Effettuato free(pv))
-- 
Poochie ©
Teoricamente la teoria è uguale alla pratica, ma in pratica non lo è...

Tommy wrote:
[CUT]   
si è vero liberare la memoria e' diverso da inizializzarla o far puntare il
puntatore a 0 
stà di fatto che quando eseguo un malloc mi ritorna errore 
io ho concluso (una conclusione azzardata ) che free non liberava e che
malloc dopo un po' non aveva più memoria libera 
ma a questo punto la domanda e' perche' malloc non alloca più?
tra l'altro non e' che restituisce un errore ma mi manda un 
"Segmetation Fault "
cosa che prima non faceva


 "Segmetation Fault "
'malloc' restituisce NULL in caso di errore. Se anziché ritornare produce 
un comportamento inaspettato, possono darsi due casi:
- c'č un bug nel gestore della memoria dinamica  (poco probabile)
- qualche operazione illegittima ha determinato un comportamento indefinito
Tra le operazioni che possono compromettere il funzionamento del gestore 
della memoria dinamica ci sono: 
- invocare 'free' piů di una volta sullo stesso valore
- scrivere oltre i confini di una zona di memoria allocata
Max
 

Max M. wrote:

beh ...ho dichiarato la variabile statica 
ma ancora non mi spiego questo
anche perchč credo che il problema abbia incominciato a sussistere quando 
ho aggiornato debian (Sid)
boh


 ma ancora non mi spiego questo
Benvenuto nel favoloso mondo dell'UB.
L'unico modo ragionevole per sperare di ottenere un aiuto è produrre una 
versione minima (e minuscola) compilabile (in puro C standard) del codice 
incriminato che esibisca lo stesso problema e sottoporla ai lettori del 
newsgroup.
Max
PS: [OT] Se l'indirizzo email che usi su Usenet è "inventato", è bene che 
tu tenga presente che potrebbe legittimamente essere, o potrebbe diventare, 
l'indirizzo di qualcun'altro. (Se è il tuo, ignora questo commento.)

> Non č che, se lo scrivevi in C con il cast, sarebbe successo
chissache'! ;)
Il cast, in C, non si usa.


Se lo avesse scritto con il cast non sarebbe successo nulla comunque.
Marcello

> Se lo avesse scritto con il cast non sarebbe successo nulla
comunque.
Ripeto: Il cast, in C, non si usa.

Andrea Laforgia wrote:

E dove sta' scritto?
Persino in K&R si trovano esempi con il cast sul malloc..
Come ha detto Marcello, il cast non disturba.. anzi.. dice
al compilatore in modo esplicito come castare, invece di
affidarsi ciecamente alla sua scelta.

 affidarsi ciecamente alla sua scelta.
Niente affatto.  Il cast, in C, non è affatto necessario e,
oltretutto, in alcuni casi anche pericoloso (vedi mancata inclusione
di stdlib.h).  Vedi sopra.

 Persino in K&R si trovano esempi con il cast sul malloc..
Retaggio di un antico passato quando malloc() restituiva un char*:
l'unico modo per farla funzionare, anche con qualcosa di diverso, era
il cast.
Visto che ultimamente (ma non troppo ultimamente, almeno dall'89
se non sbaglio) restituisce un void*, il cast non e' necessario.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

  
http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
]
Finalmente, una risposta sensata...
Marcello

 Finalmente, una risposta sensata...
Leggere un manuale, no, eh ?

Andrea Laforgia wrote:

Non vedo cosa ci sia di male nell'imparare qualcosa "senza"
necessariamente leggerla su un manuale.
Cmq, principalmente, mi riferivo al tuo modo di postare.
In linea di massima, sarebbe buona norma, qualora si dica che, a parer
proprio, qualcosa non sia corretta, spiegarne anche il motivo.
Ti prego di non prenderla come un'affesa, perche' non lo vuole essere.
Naturalmente, IMHO.
Marcello

 Finalmente, una risposta sensata...
Se non aveste aria di sfida in tutte le vostre domande di risposte sensate
ce ne sarebbero molte di piu'!
In questo NG si litiga troppo... Ad ogni modo avevo scritto la cosa del cast
proprio per questo motivo, che se andate a vedere, viene circa trattavo
almeno una volta al mese, quindi chiunque frequenta il NG dovrebbe
sapere....
Tommy

 Ti prego di non prenderla come un'affesa, perche' non lo vuole essere.
Si, hai ragione... allora quando ho detto:
"mi scuso per il cast ma mi e' stato molto piu' comodo usare un compilatore
C++...."
avresti potuto chiedere:
"perche' che problemi ci sono ad usare il cast in C?"
invece di dire:
"Non è che, se lo scrivevi in C con il cast, sarebbe successo chissache'!
;)"
presumendo che io abbia scritto la cosa puramente a caso e che tu non abbia
bisogno di sapere perche' l'ho scritta ;-)
Ad ogni modo il discorso sopra e' perfettamente corretto ;-) Spero questo
sia la fine del litigio tra te ed Andrea!!!
Tommy

 sia la fine del litigio tra te ed Andrea!!!
Nessun litigio, almeno da parte mia.
I ng si chiamano, impropriamente forse, "gruppi di discussione".
Si discute, e basta.

 ce ne sarebbero molte di piu'!
Tommy, datti una calmata tu per primo.  Non c'è nessuna aria di sfida.
Io non ho bisogno di "sfidare" nessuno.

 wrote


Non ho risposto al tuo messaggio. Ho risposto a Marcello che a mio avviso
predicava bene e razzolava male....
No ho mai detto che tu abbia bisogno di sfidare qualcuno. Ho detto che mi
pareva che questo thread prendesse una aria di sfida e stesse diventando
lungo e noioso. A quanto pare avevo ragione, data la tua scortese risposta.
Mi sembravi tu quello che diceva:
"Nessun litigio, almeno da parte mia. I ng si chiamano, impropriamente
forse, "gruppi di discussione". Si discute, e basta."
Se e' cosi' evita frasi tipo: "Tommy, datti una calmata tu per primo"
perche' escono dalla "discussione", dalla cortesia e dal tema di questo NG.
In generale trovo la frase "Tommy, datti una calmata tu per primo"
inadeguata e provocativa. Cerca di non prendere troppa confidenza, grazie.
Tommy

 sia la fine del litigio tra te ed Andrea!!!
Io ed Andrea non abbiamo litigato, credo...
... Vero Andrea? :)
Marcello

 sapere....
Frequento il NG da molto poco e non ho avuto l'accortezza di andarmi a 
guardare i posts vecchi.
Colpa mia e chiudiamo qui la questione.
Ciao.
Marcello

>Cerca di non prendere troppa confidenza, grazie.
Tommy, datti una calmata.

>> Io non ho bisogno di "sfidare" nessuno.
a me non pare! ;-)
Ti ho chiesto per cortesia di non prederti questa confidenza.
Detto questo sono completamente calmo non mi "agito" per cosi' poco.
Mi pare che se c'e' una persona agitata tra noi due quella sei tu....
Ritengo la discussione chiusa.
Tommy

Tommy, datti una calmata.

 Tommy, datti una calmata.
Laforgia, sei davvero un comico patetico ;-)
Ad ogni modo continui a non centrare il punto... Non sono agitato!!! Anzi
oggi a dire il vero credo di avere la pressione bassa... sono fiacco, stanco
ed assonnato.
Mi fa piacere vedere che non cambi mai, gli anni passano ma Laforgia rimane
lo stesso bullo attacabrighe.
La cosa buffa e' che a fare gli sbruffoni come fai tu da postazione remota
sono tutti capaci.... sarebbe bello vederti dal vivo... magari sei un
agnellino timido ed indifeso! (magari no.... sei cosi' antipatico e
sbruffone pure dal vivo)
Ad ogni modo questa e' una carellata di alcuni frasi celebri dei tuoi posts:
<QUOTE VARI>
Essendo un povero idiota, non puoi fare altro.
Idiota, sei tu che fai bene a tacere.
Eclissati, idiota!
IDIOTA.
non cambiare i subject, idiota!
Facciamo una cosa, idiota, ti "plonko", così il mio newsreader mi risparmia,
in automatico, la lettura delle tue stronzate.
Ribadisco: e' inutile che ti sforzi di convincermi che sei coglione, ti
credo ti credo ;)
L'idiota ha scritto:
</QUOTE VARI>
A mio avviso potresti sforzarti di tenere un comportamento piu' adeguato sui
NG. Dico questo con serenita' e sono calmo... sto solo esprimendo il mio
parere.... esprimere il proprio parere non vuole dire essere agitati.
Non sono agitato sono calmissimo, ad ogni modo se vuoi ripetermi il tuo
noioso consiglio fai pure ;-)
Vedi, ti consigliavo di non prendere troppa confidenza con le persone, non
trattarle male etc... ma se non mi vuoi ascoltare fai pure.... l'unica cosa
che mi dispiace e' che abbassi la qualita' di questo NG; non con le tue
risposte che normalmente sono di buona qualita', ma con le parole inutili e
fuori luogo che troppo spesso ci stanno dietro.
Buona riflessione... umh, sono troppo ottimista!
Tommy

Tommy, datti una calmata.

 Tommy, datti una calmata.
ok, se mai dovessi agitarmi provero a seguire il tuo consiglio, visto che
insisti.
ad ogni modo ribadisco il concetto che il tuo consiglio e' fuori luogo. qui
si discute di C.
Tommy