Deallocare un'area di memoria precedentemente allocata con alloc() e assicurarsi che il Puntatore non punti a un indirizzo rilevate di memoria

Da Gambas-it.org - Wikipedia.

Come è noto, la memoria allocata tramite la funzione "Alloc()" è "persistente": ossia continua ad esistere fino al termine del programma.

Essa può essere deallocata, liberata esplicitamente anche prima del termine del programma, mediante la funzione Free(). Questa funzione rende quell'area di memoria, ormai deallocata, non è più utilizzabile tramite il Puntatore, non potendosi ora accedere al contenuto (l'indirizzo di memoria dell'area ormai deallocata) del predetto Puntatore.

V'è comunque da precisare che il Puntatore, seppur assoggettato alla Funzione "Free()", non diventa nullo, come dimostra questo esempio di codice:

Public Sub Main()
 
 Dim p As Pointer
 
 p = Alloc(SizeOf(gb.Byte), 16) 
 Print "Memoria allocata --> "; p
   
 Free(p)
 Print "Free(Puntatore)  --> "; p
   
End

Assicurasi che il Puntatore non punti a un indirizzo rilevante di memoria

Dopo aver deallocato un'area di memoria, e quindi aver reso nullo il suo Puntatore, mediante la funzione "Free()", è opportuno assegnargli il valore zero (&h00).
Questa ulteriore procedura fa in modo che il Puntatore non punti a un indirizzo rilevante di memoria, eliminando così in modo sicuro e definitivo il precedente puntamento del Puntatore all'area di memoria, ormai comunque già deallocata con la funzione "Free()". Insomma detto assegnamento del valore "zero" annulla la variabile di tipo Puntatore.

L'effetto può essere verificato, infatti, per mezzo del seguente codice:

Public Sub Main()
 
 Dim p As Pointer
 
 p = Alloc(SizeOf(gb.Byte), 16) 
 Print "Memoria allocata --> "; p
   
 Free(p)
 Print "Free(Puntatore)  --> "; p
   
 p = 0
 Print "Puntatore = 0    --> "; p
   
End

Va ad ogni modo precisato che l'eventuale assegnazione del valore di default (zero) al Puntatore di un'area di memoria, da deallocare, deve essere comunque preceduta dal passaggio del Puntatore medesimo per la funzione "Free()", non potendosene prescindere pena la sollevazione in console dell'avviso:

"1 allocation(s) non freed".

Ai fini descritti nella presente pagina utilizzeremo, pertanto, in necessaria sequenza prima l'istruzione "Free()" di de-allocazione e dopo l'annullamento del Puntatore mediante l'assegnamento ad esso del valore "zero":

Public Sub Main()
 
 Dim p As Pointer
 
 p = Alloc(SizeOf(gb.Byte), 16) 
  
   
 Free(p)

 p = 0
       
End