Newsgroup: it.comp.lang.c
Titolo: free

Cosa succede se scrivo questo codice:
int **vettore;
vettore=(int**)malloc(100*sizeof(int*));
ed in seguito;
free(&vettore[50]);
Ottengo quello che voglio (cioè deallocare metà vettore) oppure no ?
Inoltre è saggio utilizzare la funzione realloc oppure per qualche ragine è
più saggio scriversi una funzione ad hoc ?
grazie mille dnt
--
____________________________________________________
________________________________________________
Visita il mio sito: 
http://members.xoom.it/DanxVB

 
Succede che annodi l'heap, ovvero lo attorcigli ben
benino....
malloc -> ti rende disponibile una porzione di memoria 
free   -> rende al s.o. le porzioni allocate con malloc
esempietto:
voglio una torta: malloc(torta) -> ora il s.o. sa' che te hai
un oggetto 'torta'
adesso, come hai fatto tu, dealloco una fetta:
free (fettaditorta) -> il s.o. ora si riprende l'oggetto
'fettaditorta' ma, purtroppo, non sa dove andarlo a pescare
quest'oggetto, perche' tu avevi una 'torta'...
Risultato: l'heap (ovvero colui che si occupa, tra le varie
cose, di tenere traccia delle free/malloc), nel migliore dei
casi non fa nulla, nel peggiore si corrompe, con il risultato
che le prossime malloc/free potranno inchiodarti il PC.
Tutto dipende anche dal s.o. usato... le vie dell'heap sono
infinite....
Sono stato un po' lunghetto a raccontare, perche' dietro a
quello che si poteva rispondere con due righe, c'era tutto un
mondo di motivi, e credo che magari ti faccia piacere sapere
che cosa succede in un pc quando si fa free e malloc :))
Ovviamente a grandisssssime linee ;)
Risposta breve:
per allungare o accorciare, si usa realloc. La tua free NON
funziona perche' gli passi un puntatore non creato da una
malloc.
Ciao, Andrea
-- 
------------------------------------
arimicci @@ aritaly. com  .~~~.  ))
                (\__/)  .'     )  ))
  Andrea        /o o  \/     .~
      Rimicci  {o_,    \    {
                 / ,  , )    \     .
 * Developer *   `~  '-' \    } ))
C C++ cgi miva  _(    (   )_.'
Java           '---..{____}
OS/2 Warp Server for Ebusiness admin
--------- OS/2 V5 "Phoenix" --------

più saggio scriversi una funzione ad hoc ?
E' piu' saggio usare le funzioni della libreria, che riscriversele.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------------
"There is nothing better for understanding a kangaroo
 than seeing it jump." [D.Grune, C.J.H. Jacobs]

 Visita il mio sito: 
http://members.xoom.it/DanxVB
Quello che ottieni non e' la deallocazione di mezzo vettore,
ma la creazione di un mezzo casino (anzi di un casino totale).
Come da manuale, alla free() vanno passati SOLO puntatori
ottenuti tramite la malloc(), calloc() o realloc().
Tanto per essere piu' chiari. Ho provato il tuo codice su Linux
ed ho ottenuto un segnale di violazione di segmento e il crash
del programma, su WinNT il programma ha terminato senza battere
ciglio: sui S.O. seri il programma in questione si pianta, su
quelli cosi', cosi' va avanti salvo piantarsi quanto meno te lo
aspetti ;-).
Sarcasmo a parte, il comportamento del codice che hai scritto e'
completamente indeterminato.
Per quanto riguarda la seconda domanda, la realloc serve proprio
per ridimensionare spazi di memoria allocati sullo heap, e (opinione
personale) non e' mai molto furbo rifarsi ("scriversi una funzione ad
hoc") quanto e' stato fatto e funziona benissimo.
La
   newPrtP = realloc(prtP, new_size);
garantisce che quanto restituito contiene quanto puntato da ptrP
non modificato (ovviamente se new_size < old_size quanto contenuto
nella parte eccedente new_size viene perso).
L'unica cosa da non fare con la realloc e' la sequente:
...
   void* ptrP    = NULL;
   ptrP = malloc(old_size);
// DA NON FARE!
// ------------
   ptrP = realloc(ptrP, new_size);
...
Infatti, se per qualche motivo la realloc() fallisce, viene perso
l'indirizzo della vecchia zona di memoria e tanti saluti.
Ciao Angelo.