From: Simone Piccardi Date: Wed, 20 Jun 2001 12:18:44 +0000 (+0000) Subject: Aggiunte altre quattro righe sull'allocazione della memoria X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=76c2def510b553794baef8313e00d64b75652c3c;p=gapil.git Aggiunte altre quattro righe sull'allocazione della memoria --- diff --git a/process.tex b/process.tex index 2320630..7260dbb 100644 --- a/process.tex +++ b/process.tex @@ -481,11 +481,6 @@ sia pi restituito da una precedente chiamata a una qualunque delle funzioni di allocazione e che non sia già stato liberato da un'altra chiamata a \texttt{free}, in caso contrario il comportamento della funzione è indefinito. -Uno degli errori più comuni (specie se si ha a che fare con array di -puntatori) è infatti quello di chiamare \texttt{free} due volte; per evitare -questo problema una soluzione è quella di assegnare sempre a \texttt{NULL} -ogni puntatore liberato con \texttt{free}, dato che, quando il parametro è un -puntatore nullo, non viene non viene effettuata nessuna operazione. La funzione \texttt{realloc} si usa invece per cambiare (in genere aumentare) la dimensione di un'area di memoria precedentemente allocata, la funzione @@ -510,11 +505,33 @@ essere altri puntatori che puntino all'interno di un'area che si vuole ridimensionare. - - altrimenti si quello che -viene definito una \textsl{perdita di memoria} (in inglese -\textit{memory-leak}) - +Uno degli errori più comuni (specie se si ha a che fare con array di +puntatori) è infatti quello di chiamare \texttt{free} più di una volta sullo +stesso puntatore; per evitare questo problema una soluzione di ripiego è +quella di assegnare sempre a \texttt{NULL} ogni puntatore liberato con +\texttt{free}, dato che, quando il parametro è un puntatore nullo, +\texttt{free} non esegue nessuna operazione. + +Linux e le glibc hanno una implementazione delle routine di allocazione che è +controllabile dall'utente attraverso alcune variabili di ambiente, in +particolare diventa possibile tracciare questo tipo di errori usando la +variabile \texttt{MALLOC\_CHECK\_} che quando viene settata mette in uso una +versione meno efficiente delle funzioni, che però è più tollerante nei +confronti di piccoli errori come quello di chiamate doppie a \texttt{free}; in +pparticolare se la variabile è posta a zero gli errori vengono ignorati, se è +posta ad 1 viene stampato un avviso sullo standard error e se + + +Il problema più comune e più difficile da tracciare che si incontra con +l'allocazione della memoria è però quando la memoria non più utilizzata non +viene opportunamente liberata (quello che in inglese viene chiamato +\textit{memory-leak}, traducibile come \textsl{perdita di memoria}). + +Un caso tipico è quando l'allocazione viene fatta da una subroutine per un uso +locale, ma la memoria non viene liberata una volta usata; in questo caso la +memoria resta allocata, causando a lungo andare un esaurimento della memoria +disponibile con un conseguente crash dell'applicazione in un momento del tutto +scorrelato rispetto al verificarsi della condizione di errore. \subsection{La funzione \texttt{alloca}} @@ -526,8 +543,13 @@ viene definito una \textsl{perdita di memoria} (in inglese \label{sec:proc_mem_sbrk} +\subsection{La personalizzazione delle funzioni di allocazione} +\label{sec:proc_mem_malloc_custom} + + \subsection{Il controllo della memoria virtuale} -\label{sec:proc_mem_sbrk} +\label{sec:proc_mem_mlock} + \section{Il controllo di flusso non locale} \label{sec:proc_flux}