C++ Allocazione dinamica degli array con esempio

Cos'è un array dinamico?

Un array dinamico è abbastanza simile a un array normale, ma la sua dimensione è modificabile durante l'esecuzione del programma. Gli elementi DynamArray occupano un blocco di memoria contiguo.

Una volta creato un array, la sua dimensione non può essere modificata. Tuttavia, un array dinamico è diverso. Un array dinamico può espandere le proprie dimensioni anche dopo essere stato riempito.

Durante la creazione di un array, ad esso viene allocata una quantità predeterminata di memoria. Questo non è il caso di un array dinamico poiché aumenta la dimensione della memoria di un certo fattore quando ce n'è bisogno.

Fattori che influiscono sulle prestazioni degli array dinamici

La dimensione iniziale dell'array e il suo fattore di crescita determinano le sue prestazioni. Nota i seguenti punti:

  1. Se un array ha dimensioni ridotte e un fattore di crescita ridotto, continuerà a riallocare la memoria più spesso. Ciò ridurrà le prestazioni dell'array.
  2. Se un array ha grandi dimensioni e un fattore di crescita elevato, avrà un'enorme porzione di memoria inutilizzata. Per questo motivo, le operazioni di ridimensionamento potrebbero richiedere più tempo. Ciò ridurrà le prestazioni dell'array.

La nuova parola chiave

In C++, possiamo creare un array dinamico usando la parola chiave new. Il numero di elementi da allocare è specificato all'interno di una coppia di parentesi quadre. Il nome del tipo dovrebbe precedere questo. Il numero di elementi richiesto verrà allocato.

Sintassi

La parola chiave new ha la seguente sintassi:

pointer_variable = new data_type;

La variabile_puntatore è il nome del file puntatore variabile.

Il tipo_dati deve essere valido C++ tipo di dati.

La parola chiave restituisce quindi un puntatore al primo elemento. Dopo aver creato l'array dinamico, possiamo eliminarlo utilizzando la parola chiave delete.

Esempio 1:

#include<iostream>
using namespace std;
int main() {
	int x, n;
	cout << "Enter the number of items:" << "\n";
	cin >>n;
	int *arr = new int[n];
	cout << "Enter " << n << " items" << endl;
	for (x = 0; x < n; x++) {
		cin >> arr[x];
	}
	cout << "You entered: ";
	for (x = 0; x < n; x++) {
		cout << arr[x] << " ";
	}
	return 0;
}

Produzione:

La nuova parola chiave

Ecco uno screenshot del codice:

La nuova parola chiave

Spiegazione del codice:

  1. Includi il file header iostream nel nostro programma per usarlo funzioni.
  2. Includi lo spazio dei nomi std nel nostro programma per poter utilizzare le sue classi senza chiamarlo.
  3. Chiama la funzione main(). La logica del programma dovrebbe essere aggiunta all'interno del corpo della funzione.
  4. Dichiarare due variabili intere x e n.
  5. Stampa del testo sulla console chiedendo all'utente di inserire il valore della variabile n.
  6. Leggere l'input dell'utente dalla tastiera e assegnarlo alla variabile n.
  7. Dichiara un array per contenere un totale di n numeri interi e assegnalo alla variabile puntatore *arr.
  8. Stampa un messaggio che richiede all'utente di inserire n numero di elementi.
  9. Utilizzare un ciclo for per creare una variabile di ciclo x per scorrere gli elementi immessi dall'utente.
  10. Legge gli elementi immessi dall'utente e li memorizza nell'array arr.
  11. Fine del corpo del per loop.
  12. Stampa del testo sulla console.
  13. Utilizzare un ciclo for per creare una variabile di ciclo x per scorrere gli elementi dell'array.
  14. Stampa i valori contenuti nell'array denominato arr sulla console.
  15. Fine del corpo del ciclo for.
  16. Il programma deve restituire valore in caso di completamento positivo.
  17. Fine del corpo della funzione main().

NOTA: nell'esempio precedente, all'utente è consentito specificare qualsiasi dimensione per l'array durante il runtime. Ciò significa che la dimensione dell'array viene determinata durante il runtime.

Inizializzazione di array allocati dinamicamente

È facile inizializzare un array dinamico su 0.

Sintassi:

int *array{ new int[length]{} };

Nella sintassi precedente, la lunghezza indica il numero di elementi da aggiungere all'array. Poiché dobbiamo inizializzare l'array su 0, questo dovrebbe essere lasciato vuoto.

Possiamo inizializzare un array dinamico utilizzando un elenco di inizializzatori. Creiamo un esempio che lo dimostri.

Esempio 2:

#include <iostream>
using namespace std;

int main(void) {

	int x; 

	int *array{ new int[5]{ 10, 7, 15, 3, 11 } };

	cout << "Array elements: " << endl;

	for (x = 0; x < 5; x++) {

		cout << array[x] << endl;
	}

	return 0;
}

Produzione:

Inizializzazione di array allocati dinamicamente

Ecco uno screenshot del codice:

Inizializzazione di array allocati dinamicamente

Spiegazione del codice:

  1. Includi il file header iostream nel nostro programma per utilizzare le sue funzioni.
  2. Includi lo spazio dei nomi std nel nostro programma per utilizzare le sue classi senza chiamarlo.
  3. Chiama la funzione main(). La logica del programma dovrebbe essere aggiunta all'interno del corpo della funzione.
  4. Dichiarare una variabile intera denominata x.
  5. Dichiarare un array dinamico denominato array utilizzando un elenco di inizializzatori. L'array conterrà 5 elementi interi. Tieni presente che non abbiamo utilizzato l'operatore "=" tra la lunghezza dell'array e l'elenco degli inizializzatori.
  6. Stampa del testo sulla console. La fine è a C++ parola chiave che significa fine riga. Sposta il cursore alla frase successiva.
  7. Utilizzare un ciclo for per scorrere gli elementi dell'array.
  8. Stampa il contenuto dell'array denominato array sulla console.
  9. Fine del corpo del ciclo for.
  10. Il programma deve restituire valore in caso di completamento positivo.
  11. Fine del corpo della funzione main().

Ridimensionamento degli array

La lunghezza di un array dinamico viene impostata durante il tempo di allocazione.

Però, C++ non ha un meccanismo integrato per ridimensionare un array una volta che è stato allocato.

È tuttavia possibile superare questa sfida allocando dinamicamente un nuovo array, copiando gli elementi e quindi cancellando il vecchio array.

Nota: questa tecnica è soggetta a errori, quindi cerca di evitarla.

Eliminazione dinamica degli array

Un array dinamico dovrebbe essere eliminato dalla memoria del computer una volta raggiunto il suo scopo. L'istruzione delete può aiutarti a raggiungere questo obiettivo. Lo spazio di memoria liberato può quindi essere utilizzato per contenere un altro set di dati. Tuttavia, anche se non si elimina l'array dinamico dalla memoria del computer, verrà eliminato automaticamente una volta terminato il programma.

Nota:

Per eliminare un array dinamico dalla memoria del computer, è necessario utilizzare delete[], invece di delete. Il [] indica alla CPU di eliminare più variabili anziché una variabile. L'uso di delete invece di delete[] quando si ha a che fare con un array dinamico può causare problemi. Esempi di tali problemi includono perdite di memoria, danneggiamento dei dati, arresti anomali, ecc.

Esempio 3:

#include<iostream>
using namespace std;
int main() {
	int x, n;
	cout << "How many numbers will you type?" << "\n";
	cin >>n;
	int *arr = new int[n];
	cout << "Enter " << n << " numbers" << endl;
	for (x = 0; x < n; x++) {
		cin >> arr[x];
	}
	cout << "You typed: ";
	for (x = 0; x < n; x++) {
		cout << arr[x] << " ";
	}
	cout << endl;
	delete [] arr;
	return 0;
}

Produzione:

Eliminazione dinamica degli array

Ecco uno screenshot del codice:

Eliminazione dinamica degli array

Spiegazione del codice:

  1. Includi il file header iostream nel nostro programma per poter utilizzare le sue funzioni.
  2. Includi lo spazio dei nomi std nel nostro programma per poter utilizzare le sue classi senza chiamarlo.
  3. Chiama la funzione main(). La logica del programma dovrebbe essere aggiunta all'interno del corpo della funzione.
  4. Dichiarare due variabili x e n del tipo di dati intero.
  5. Stampa del testo sulla console. Il testo chiederà all'utente di indicare il numero di numeri che inserirà.
  6. Leggere l'input dell'utente dalla tastiera. Il valore di input verrà assegnato alla variabile n.
  7. Dichiarare una variabile puntatore *arr. L'array arr riserverà della memoria per memorizzare un totale di n numeri interi.
  8. Stampa un messaggio sulla console chiedendo all'utente di inserire n numeri.
  9. Crea un ciclo for e la variabile del ciclo x per scorrere i numeri immessi dall'utente.
  10. Legge i numeri immessi dall'utente e li memorizza nell'array arr.
  11. Fine del corpo del ciclo for.
  12. Stampa del testo sulla console.
  13. Utilizzare un ciclo for e la variabile del ciclo x per scorrere il contenuto dell'array arr.
  14. Stampa i valori dell'array arr sulla console.
  15. Fine del corpo del ciclo for.
  16. Stampa una riga vuota sulla console.
  17. Liberare la memoria dell'array arr.
  18. Il programma restituirà il valore una volta completato con successo.
  19. Fine del corpo della funzione main().

Sintesi

  • Gli array regolari hanno una dimensione fissa. Non è possibile modificare la loro dimensione una volta dichiarata.
  • Con questi tipi di array, la dimensione della memoria viene determinata durante la fase di compilazione.
  • Gli array dinamici sono diversi. Le loro dimensioni possono essere modificate durante il runtime.
  • Negli array dinamici, la dimensione viene determinata durante il runtime.
  • Array dinamici in C++ vengono dichiarati utilizzando la nuova parola chiave.
  • Utilizziamo le parentesi quadre per specificare il numero di elementi da memorizzare nell'array dinamico.
  • Una volta terminato l'array, possiamo liberare la memoria utilizzando l'operatore delete.
  • Utilizzare l'operatore delete con [] per liberare la memoria da tutti gli elementi dell'array.
  • Una cancellazione senza [] libera la memoria di un solo elemento.
  • Non esiste un meccanismo integrato per ridimensionare C++ array.
  • Per inizializzare un array utilizzando un inizializzatore di elenco, non utilizziamo l'operatore “=".

Scopri di più leggi di più