Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Documenti analoghi
Allocazione Dinamica della Memoria

Corso di Fondamenti di Informatica

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Allocazione dinamica della memoria

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Allocazione statica della memoria

Introduzione al C. Unità Gestione Dinamica della Memoria

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe

Gestione dinamica della memoria

Passaggio parametri puntatore

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Il puntatore. Il puntatore

Fondamenti di Informatica T. Linguaggio C: i puntatori

Operatore di indirizzo

Il linguaggio C. Puntatori e dintorni

Introduzione ai puntatori

Uso avanzato dei puntatori Allocazione dinamica della memoria

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

La gestione della memoria dinamica Heap

La Gestione della Memoria. Carla Binucci e Walter Didimo

Strutture Dati Dinamiche

Il linguaggio C. Puntatori e Array

Programmazione con Java

Programmazione Procedurale in Linguaggio C++

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Il linguaggio C. Puntatori e dintorni

L'allocazione dinamica della memoria

Università degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Array. Anno Accademico 2010/2011 Francesco Tortorella

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Allocazione dinamica della memoria

Allocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica

Spazio di indirizzamento virtuale

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Lezione 9 programmazione in Java Classi come contenitori

I PUNTATORI E LE STRUTTURE DATI DINAMICHE. Cosimo Laneve/Ivan Lanese

Gestione della Memoria

Lezione 11 programmazione in Java. Anteprima. Gestione della memoria

I puntatori. tipo <TipoPuntatore> = puntatore a <TipoDiDato>; riserva <VariabilePuntatore> : <TipoPuntatore>; Per esempio:

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

L apertura di un file ci restituisce un puntatore a una struttura chiamata FILE fopen:

Corso di Fondamenti di Informatica

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Allocazione Dinamica della Memoria

Laboratorio di Algoritmi e Strutture Dati. La gestione della memoria dinamica Heap

Linguaggio C: PUNTATORI

Programmazione (imperativa)

C: panoramica. Violetta Lonati

Ottenere una modifica del parametro attuale

Laboratorio di Informatica

Linguaggio C: puntatori

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 24 Ottobre 2014

Strutture Dinamiche. Fondamenti di Informatica

Assembly (3): le procedure

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

Passare argomenti al programma

Allocazione dinamica della memoria - riepilogo

Struct, enum, Puntatori e Array dinamici

Allocazione dinamica

L uso della memoria L allocazione dinamica della memoria in C Le funzioni malloc, calloc, realloc e free L allocazione dinamica in C++

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Esercizi Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Strutture dati nel supporto a run time

Record di Attivazione

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Funzioni, Stack e Visibilità delle Variabili in C

L'Allocazione Dinamica della Memoria nel linguaggio C

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Esercizi Array Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I)

Introduzione ai puntatori in C Definizione

Programmazione modulare

Vediamo come allocare dinamicamente un vettore di double: int dim; double *vect; cout << Dimmi la dimensione del vettore : ; cin >> dim;

Convenzioni di chiamata a procedure

Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe

Corso di Programmazione ad Oggetti

Sommario. Le differenze fra C e C++ Funzioni. Varie. Memoria. commenti. parametri per funzioni funzioni inline overloading di funzione

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Prof.Ing.S.Cavalieri Puntatori e Heap in Linguaggio C. Puntatori e Heap

Corso di Fondamenti di Informatica Algoritmi su array / 2

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Architettura dei calcolatori e sistemi operativi. M2 Organizzazione della memoria virtuale Struttura dello spazio virtuale kernel e utente

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Laboratorio di Programmazione Anno Accademico

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Indirizzi e tipi puntatore a

La classe std::vector della Standard Template Library del C++

Algoritmi su array / 2

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Puntatori in C Lucidi della Pof.ssa Pazienza

Transcript:

di Cassino e del Lazio Meridionale Corso di Informatica Allocazione dinamica di memoria Anno Accademico 2015/2016 Francesco Tortorella

Allocazione dinamica di memoria Finora abbiamo considerato variabili le cui dimensioni erano note a compile time. Ci riferiamo in particolare ad array le cui cardinalità dovevano essere note all atto della definizione. Spesso però l effettiva dimensione non è nota se non a run time. La soluzione adottata consisteva nel definire un array di ampia dimensione, sicuramente adeguata per le esigenze a tempo di esecuzione.

Mappa della memoria per un processo Heap Stack: Variabili automatiche Data segment: Variabili statiche Code segment: Istruzioni l.m.

Allocazione dinamica di memoria Il problema è che una gran parte di spazio rimaneva inutilizzata. Una soluzione molto più efficiente sarebbe quella di allocare la variabile solo quando ne conosciamo la dimensione effettiva, a tempo di esecuzione. Questa possibilità è fornita dall allocazione dinamica di memoria.

L operatore new Per allocare dinamicamente una variabile si usa l operatore new. È necessario precisare il tipo della variabile da allocare. L operatore restituisce l indirizzo della variabile allocata che deve essere assegnato ad un puntatore. Diversamente da quanto succedeva con le variabili allocate staticamente, la variabile allocata dinamicamente non ha un identificatore con cui essere riferita.

L operatore new Sintassi dell operatore new: puntatore = new tipo; L effetto dell esecuzione è l allocazione in memoria di un blocco della dimensione adeguata per ospitare una variabile di tipo tipo. L indirizzo del blocco viene restituito dall operatore e assegnato a puntatore. D ora in poi si potrà accedere alla variabile allocata tramite puntatore.

L operatore new int main(int argc, char** argv) { int *p; p = new int; cin >> *p; *p = *p + 4; cout << *p; Allocazione di una variabile int Uso della variabile allocata }

Allocazione dinamica di array Tramite new è possibile allocare una variabile array. Questa volta, oltre al tipo, va specificata la dimensione dell array: puntatore = new tipo[size]; size è la dimensione dell array e può essere specificata da una variabile (o un espressione).

Allocazione dinamica di array int main(int argc, char** argv) { int *p; int n; cout << "Dimensione array: "; cin >> n; p = new int[n]; Allocazione di un array di int di dimensione n letta da input leggi_array(p,n); stampa_array(p,n); Uso dell array allocato return (EXIT_SUCCESS); }

Controllo dell allocazione Nel caso la memoria richiesta non possa essere allocata, new restituisce NULL. È quindi necessario fare una verifica sul puntatore prima di usarlo per evitare di indirizzare un puntatore NULL. int main(int argc, char** argv) { int *p; p = new int; if (p==null){ cout << Memoria non disponibile << endl; return -1; } cin >> *p; *p = *p + 4; cout << *p; return(exit_success); }

Deallocazione L allocazione dinamica di memoria opera su uno spazio di memoria limitato e quindi non è possibile procedere con l allocazione in maniera indefinita. Le variabili utilizzate e di cui non si richiede ulteriore impiego vanno quindi deallocate per lasciare spazio alle allocazioni successive.

Deallocazione Per questo scopo esiste l operatore delete che, applicato ad un puntatore, dealloca (cioè rende disponibile per richieste successive di allocazione) il blocco di memoria il cui indirizzo è presente nel puntatore. Sintassi per variabili semplici: delete puntatore; Sintassi per variabili array: delete [] puntatore;

Deallocazione dell array int main(int argc, char** argv) { int *p; int n; cout << "Dimensione array: "; cin >> n; p = new int[n]; Allocazione di un array di int di dimensione n letta da input leggi_array(p,n); stampa_array(p,n); delete [] p; Uso dell array allocato Deallocazione dell array return (EXIT_SUCCESS); }

Possibili problemi Esistono diverse situazioni che causano un uso inconsistente della memoria allocata dinamicamente. In particolare consideriamo: Dangling pointer Memory leak

Dangling pointer L operatore delete non cancella il puntatore cui viene applicato, nè modifica il valore del puntatore. Questo continua a puntare ad un blocco di memoria che non è più disponibile e che può essere concesso ad un altro processo. Dereferenziare il puntatore porta quindi a riferirsi a variabili inesistenti.

Dangling pointer int main(int argc, char** argv) { int *p; p = new int; if (p==null){ cout << Memoria non disponibile << endl; return -1; } cin >> *p; delete p; Dangling pointer *p = *p + 4; cout << *p; return(exit_success); }

Memory leak A valle di un allocazione il puntatore potrebbe essere erroneamente modificato, perdendo così ogni possibilità di accedere alla memoria allocata. In questo caso, oltre a perdere il contenuto eventualmente presente in memoria, questa non potrà essere deallocata.

Memory leak int main(int argc, char** argv) { int *p; int n, t=0; cout << "Dimensione array: "; cin >> n; p = new int[n]; leggi_array(p,n); p = &t; Array ora irrangiugibile return (EXIT_SUCCESS); }

Garbage collection Alcuni linguaggi (p.es. Java e Python) mettono a disposizione la garbage collection (letteralmente raccolta dei rifiuti, a volte abbreviato con GC). La garbage collection è una modalità automatica di gestione della memoria, mediante la quale il sistema operativo, o il compilatore e un modulo di run-time, liberano le porzioni di memoria che non sono più referenziate, cioè allocate da un processo attivo, e le libererà automaticamente.