From: Simone Piccardi Date: Wed, 20 Jun 2001 18:08:03 +0000 (+0000) Subject: Arrivato a alloca X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=b68aa96c16958fda51be7ce0fc43ff51b1171342;p=gapil.git Arrivato a alloca --- diff --git a/process.tex b/process.tex index 7260dbb..45363c5 100644 --- a/process.tex +++ b/process.tex @@ -528,15 +528,40 @@ 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. - +locale, ma la memoria non viene liberata una volta usata; chiamate ripetute +alla stessa suubroutine causeranno a lungo andare un esaurimento della memoria +disponibile, con un conseguente crash dell'applicazione che può avvenire in +qualunque momento senza nessuna relazione con la subroutine che contiene +l'errore. + +Per questo motivo l'implementazione delle routine di allocazione delle glibc +mette a disposizione una serie di funzionalità (su cui torneremo in +\secref{sec:proc_mem_advanced}) che permettono di tracciare le allocazioni e +le disallocazione, e definisce anche una serie di possibili agganci che +permettono di sostituire alle funzioni di libreria una propria versione (che +può essere più o meno specializzata per il debugging). \subsection{La funzione \texttt{alloca}} \label{sec:proc_mem_alloca} +Una alternativa possibile all'uso di \texttt{malloc}, che non soffre del tipo +di problemi di memomry leak descritti in precedenza è la funzione +\texttt{alloca} che invece che allocare la memoria nello heap usa lo il +segmento di stack della funzione corrente. La sintassi è identica: +\begin{prototype}{stdlib.h}{void *alloca(size\_t size)} + Alloca \texttt{size} bytes nel segmento di stack della funzione chiamante. + La memoria non viene inizializzata. + + La funzione restituisce il puntatore alla zona di memoria allocata in caso + di successo e \texttt{NULL} in caso di fallimento, nel qual caso + \texttt{errno} viene settata a \texttt{ENOMEM}. +\end{prototype} +ma in questo caso non è più necessario liberare la memoria in quanto questa +viene rilasciata automaticamente al ritorno della funzione. + +Come è evidente questa funzione ha molti vantaggi, in particolare in Linux +la funzione è molto veloce ed occupa poco spazio, essendo codificata +direttamente dentro il compilatore, inoltre \subsection{Le funzioni \texttt{brk} e \texttt{sbrk}}