lunedì 26 novembre 2012

Allocazione dinamica della Memoria

Dopo aver dichiarato una variabile in C++ viene allocata la memoria necessaria per esso. Una volta che la funzione della variabile ha terminato il suo lavoro, la memoria viene liberata. Questa memoria è utilizzata per le variabili locali viene chiamata stack. Ma esiste un altro tipo di memoria che persiste indipendentemente dalle funzioni del programma. Tu, come programmatore sei incaricato di allocare e liberare questa memoria, collettivamente chiamata heap (o registro libero).
A questo punto si può pensare, “Perché utilizzare un tipo di memoria diversa? Lo stack funziona in modo ottimale per me, grazie.” Tuttavia usare la memoria dinamica del heap offre grandi benefici in termini di efficienza. Usando heap, si occupa la sola memoria necessaria al momento nel quale viene utilizzata, ad esempio se un livello del gioco ha cento nemici, si può allocare la memoria all'inizio del livello e liberarla subito dopo la conclusione dello stesso. Heap inoltre permette di creare un oggetto in una funzione, cui si possa accedere anche al termine della funzione stessa (senza dover restituire una copia dell'oggetto). Si può creare un oggetto a schermo in una funzione e ritornare al suo accesso. Lo strumento della memoria dinamica è molto importante nello sviluppo dei giochi.

Presentare il programma Heap

Il programma Heap è una dimostrazione della memoria dinamica. Il programma alloca la memoria dinamicamente per una variabile intera, ne assegna un valore e quindi la mostra a schermo. Successivamente viene richiamata una funzione che alloca memoria dinamica per un'altra variabile intera, ne assegna il valore e restituisce il puntatore ad essa. Il programma prende i valori del puntatore restituito e lo usa per visualizzare la variabile a schermo, quindi libera la memoria allocata nel heap. Infine vi sono due esempi di utilizzo scorretto della memoria dinamica.

//Heap
//Dimostra la memoria dinamica
#include<iostream>
using namespace std;
int* interosuHeap(); //restituisce intero su Heap
void perdita1(); //creano perdite di memoria
void perdita2();
int main()
{
    int* pHeap = new int;
    *pHeap = 30;
    cout << “*pHeap: ” << *pHeap << endl;
    int* pHeap2 = interosuHeap();
    cout << “*pHeap2: ” << *pHeap2 << endl;
    cout << “Liberare la memoria che punta a pHeap e pHeap2.” << endl;
         delete pHeap;
        delete pHeap2;
        pHeap =0;
       pHeap2 =0;
      return 0;
}
  
 int* interosuHeap()
  {
        int* pTemp = new int(30);
     return pTemp;
   }

void perdita1()
  {  int* dripeti1 = new int(40); }

void perdita2()
  { int* dripeti2 = new int(50);
     dripeti2 = new int(200);
     delete dripeti2;
  }

Uso dell'operatore new

L'operatore new alloca la memoria su heap e restituisce il suo indirizzo. Puoi usare new seguito dal tipo di valore che si vuole riservare lo spazio. Questo è ciò che viene scritto sulla prima linea di main ().
int* pHeap = new int;
La parte della dichiarazione new int alloca abbastanza memoria su heap necessaria per un solo intero e restituisce l'indirizzo di quel blocco di memoria su heap. L'altra parte della dichiarazione int*pHeap, dichiara un puntatore locale, pHeap, il quale punta alla locazione di memoria appena allocata sul blocco heap. Usando pHeap, si può manipolare il blocco di memoria riservato per l'intero. Quello che viene fatto nell'istruzione successiva è di assegnare il valore 30 al blocco di memoria e quindi mostrare il valore immagazzinato, usando pHeap, così come ogni altro puntatore all'intero. La sola differenza è che pHeap punta alla memoria su heap non allo stack.
Uno dei maggiori vantaggi della memoria su heap è che persiste oltre la funzione nella quale viene allocata, significa che creare un oggetto su heap in una funzione e restituire un puntatore o riferimento ad essa.

int* pHeap2 = interosuHeap();
La funzione richiamata interosuHeap(), alloca un blocco di memoria su heap per un intero ed assegna un valore di 30 ad esso.

int* interosuHeap()
{
int* pTemp = new int(30);
return pTemp;}
Quindi la funzione restituisce un puntatore a questo blocco di memoria. Tornando a main(), l'indirizzo del blocco di memoria viene assegnato a pHeap2. In seguito viene visualizzato il contenuto mediante l'istruzione.

cout << “*pHeap2: ” << *pHeap2 << endl;

Nessun commento:

Posta un commento