Come lavorare con l'allocazione dinamica della memoria C ++?



Questo articolo esplora l'allocazione dinamica della memoria in C ++, un'importante funzionalità che consente di considerare le esigenze di memoria per le risorse in tempo reale.

L'allocazione dinamica della memoria In C ++ è una funzionalità molto importante che ti consente di considerare i tuoi requisiti per far fronte alla necessità di risorse in tempo reale. In questo articolo vorremmo esplorare Esplorazione in dettaglio. I seguenti puntatori saranno trattati in questo articolo,

Quindi iniziamo con questo articolo sull'allocazione dinamica della memoria in C ++





Hai bisogno di allocazione dinamica della memoria?

Diciamo, vogliamo inserire una frase come un array di caratteri ma non siamo sicuri del numero esatto di caratteri richiesti nell'array.

Ora, mentre si dichiara l'array di caratteri, se specifichiamo la sua dimensione inferiore alla dimensione della stringa desiderata, allora otterremo un errore perché lo spazio nella memoria allocato all'array è minore rispetto alla dimensione della stringa di input. Se specifichiamo la sua dimensione maggiore della dimensione della stringa di input, all'array verrà assegnato uno spazio nella memoria che è molto più grande della dimensione della stringa desiderata, consumando così inutilmente più memoria anche quando non è richiesto.



Nel caso precedente, non abbiamo idea della dimensione esatta dell'array fino al momento della compilazione (quando il computer compila il codice e la stringa viene immessa dall'utente). In questi casi, utilizziamo l'estensione nuovo operatore.

C ++ definisce due operatori unari nuovo e Elimina che svolgono il compito di allocare e deallocare la memoria durante il runtime. Poiché questi operatori (new e delete) operano sulla memoria di archiviazione libera (memoria Heap), sono anche chiamati operatori di archiviazione libera. I puntatori forniscono il supporto necessario per il sistema di allocazione dinamica della memoria in C ++.

Con l'aiuto dell'allocazione dinamica, un programma può ottenere memoria durante il runtime.



Le variabili globali e locali vengono assegnate alla memoria durante la fase di compilazione. Tuttavia, non possiamo aggiungere variabili globali o locali durante il runtime. Se il programma ha bisogno di utilizzare una quantità variabile di memoria, avremmo bisogno di allocare memoria durante il runtime, come e quando necessario. E, naturalmente, qui le routine di allocazione dinamica possono servire allo scopo.

Differenze tra allocazione di memoria statica e allocazione di memoria dinamica:

Questa è un'architettura di memoria di base utilizzata per qualsiasi programma C ++:

Memoria - Allocazione dinamica della memoria - Edureka

Avremo bisogno di un'immagine come questa

Lo stack viene utilizzato per l'allocazione della memoria statica e l'heap per l'allocazione dinamica della memoria, entrambi sono archiviati nella RAM del computer.

Variabili che vengono allocate nello stack mentre l'allocazione della memoria statica viene archiviata direttamente nella memoria e l'accesso a questa memoria è molto veloce, inoltre la sua allocazione viene gestita quando il programma viene compilato. Quando una funzione o un metodo chiama un'altra funzione che a sua volta potrebbe chiamare un'altra funzione e così via, l'esecuzione di tutte queste funzioni rimane sospesa fino a quando l'ultima funzione restituisce il suo valore. Lo stack è sempre memorizzato in un ordine LIFO (last in first out), il blocco riservato più di recente è sempre il blocco successivo da liberare. Questo aiuta a tenere traccia dello stack, liberare un blocco dallo stack non è altro che regolare un puntatore.

Le variabili allocate sull'heap hanno la loro memoria allocata in fase di esecuzione durante l'allocazione dinamica della memoria. L'accesso a questa memoria è un po 'più lento rispetto allo stack, ma la dimensione dell'heap è limitata solo dalla dimensione della memoria virtuale. L'elemento dell'heap non ha dipendenze tra loro ed è sempre possibile accedervi in ​​modo casuale in qualsiasi momento. Possiamo allocare un blocco in qualsiasi momento e liberarlo in qualsiasi momento. Ciò rende difficile tenere traccia di quali parti dell'heap vengono allocate o deallocate in un dato momento.

Andando avanti con questo articolo sull'allocazione dinamica della memoria in C ++

Allocazione della memoria utilizzando nuovo Parola chiave

In C ++ il nuovo L'operatore viene utilizzato per allocare la memoria in fase di esecuzione e la memoria viene allocata in byte. Il nuovo operatore denota una richiesta di allocazione dinamica della memoria sull'heap. Se è disponibile memoria sufficiente, il file nuovo L'operatore inizializza la memoria e restituisce l'indirizzo della memoria appena allocata e inizializzata alla variabile del puntatore.

come uscire dal programma in java

Sintassi:

datatype * pointer_name = nuovo tipo di dati

Esempio:

int * ptr = new int // Possiamo dichiarare una variabile durante l'allocazione dinamica nei due modi seguenti. int * ptr = new int (10) int * ptr = new int {15} // L'operatore new viene utilizzato anche per allocare un blocco (un array) di memoria di tipo data-type. int * ptr = new int [20] // L'istruzione precedente alloca dinamicamente memoria per 20 interi continuamente di tipo int e restituisce un puntatore al primo elemento della sequenza al puntatore 'ptr'.

Nota : Se l'heap non dispone di memoria sufficiente per l'allocazione, la nuova richiesta indica un errore generando un'eccezione std :: bad_alloc, a meno che 'nothrow' non venga utilizzato con l'operatore new, nel qual caso restituisce un puntatore NULL. Pertanto, è buona norma controllare la variabile puntatore prodotta da new prima di utilizzarla nel programma.

Andando avanti con questo articolo sull'allocazione dinamica della memoria in C ++

Deallocazione della memoria utilizzando Elimina Parola chiave:

Una volta che la memoria heap viene allocata a una variabile o a un oggetto classe utilizzando l'estensione nuovo parola chiave, possiamo deallocare quello spazio di memoria usando la Elimina parola chiave.

Sintassi:

delete pointer_variable // Qui, pointer_variable è il puntatore che punta all'oggetto dati creato da new. delete [] pointer_variable // Per liberare la memoria dell'array allocata dinamicamente puntata da pointer-variable usiamo la seguente forma di cancellazione:

Esempio:

elimina ptr elimina [] ptr

Nota : L'estensione dell'oggetto o la durata dell'oggetto è il tempo durante il quale l'oggetto rimane in memoria durante l'esecuzione del programma. L'allocazione della memoria dell'heap è più lenta di uno stack, poiché, nell'heap, non esiste un ordine particolare in cui è possibile allocare la memoria mentre nello stack segue LIFO.

Andando avanti con questo articolo sull'allocazione dinamica della memoria in C ++

Allocazione dinamica di array

L'uso principale del concetto di allocazione dinamica della memoria è per allocare memoria a un array quando dobbiamo dichiararlo specificando la sua dimensione ma non ne siamo sicuri.

Vediamo, un esempio per capire il suo utilizzo.

#include utilizzando lo spazio dei nomi std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * mark = new int [len] // Allocazione dinamica della memoria cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (segni + i)} per (int i = 0 i

Spiegazione:
In questo esempio prima chiediamo all'utente il numero di studenti in una classe e memorizziamo il suo valore nella variabile len. Quindi dichiariamo un array di numeri interi e allochiamo spazio in memoria dinamicamente uguale al valore memorizzato nella variabile len usando questa istruzione int * contrassegni = nuovo int [lunghezza] quindi viene assegnato uno spazio uguale a 'lunghezza * (dimensione di 1 numero intero)'. Il resto del codice è autoesplicativo.

Andando avanti con questo articolo sull'allocazione dinamica della memoria in C ++

Allocazione dinamica della memoria per gli oggetti

Possiamo anche allocare dinamicamente gli oggetti.

ordinamento di array c ++

Come sappiamo, Constructor è una funzione membro di una classe speciale utilizzata per inizializzare un oggetto e Destructor è anche una funzione membro di classe che viene chiamata ogni volta che l'oggetto esce dall'ambito.

Destructor può essere utilizzato per rilasciare la memoria assegnata all'oggetto. È chiamato nelle seguenti condizioni.

  • Quando un oggetto locale esce dall'ambito
  • Per un oggetto globale, quando un operatore viene applicato a un puntatore all'oggetto della classe

Possiamo ancora utilizzare i puntatori mentre allocare dinamicamente la memoria agli oggetti.

Vediamo un esempio di una serie di oggetti.

#include utilizzando lo spazio dei nomi std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Produzione:

Spiegazione:

Il Constructor verrà chiamato tre volte poiché stiamo allocando memoria a tre oggetti della classe Random. Il distruttore verrà anche chiamato tre volte durante ciascuno di questi oggetti. 'Random * a = new Random [3]' questa istruzione è responsabile dell'allocazione dinamica della memoria del nostro oggetto.

Quindi siamo giunti alla fine di questo articolo su 'Allocazione dinamica della memoria C ++'. Se desideri saperne di più, dai un'occhiata al da Edureka, una società di apprendimento online affidabile. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per formarti sia sui concetti di base che avanzati su Java insieme a vari framework Java come Hibernate e Spring.

Hai domande per noi? Per favore, menzionalo nella sezione commenti di questo blog e ti risponderemo il prima possibile.