Allocare dinamicamente un array in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’operatore new() per allocare dinamicamente array in C++
  2. Usa il metodo std::unique_ptr per allocare dinamicamente array in C++
  3. Usa il metodo std::make_unique() per allocare dinamicamente array in C++
Allocare dinamicamente un array in C++

In questo articolo vengono illustrati più metodi su come allocare dinamicamente un array in C++.

Usa l’operatore new() per allocare dinamicamente array in C++

L’operatore new alloca dinamicamente l’oggetto sulla memoria heap e restituisce un puntatore alla posizione. In questo programma di esempio, dichiariamo la matrice e la dimensione dei caratteri costanti come una variabile int. Quindi, allochiamo dinamicamente l’array char e assegniamo i valori corrispondenti ai suoi elementi nel corpo del cicli for.

Notare che l’operatore delete deve essere chiamato esplicitamente una volta che la memoria associata al puntatore arr non è più necessaria. Le parentesi specificate dopo l’operatore delete dicono al compilatore che il puntatore si riferisce al primo elemento di un array. Se le parentesi vengono omesse quando si elimina un puntatore a un array, il comportamento non è definito.

#include <iostream>

using std::cout;
using std::endl;

constexpr int SIZE = 10;
static const char chars[] = {'B', 'a', 'd', 'C', 'T', 'L', 'A', 'R', 'e', 'I'};

int main() {
  char *arr = new char[SIZE];

  for (int i = 0; i < SIZE; ++i) {
    arr[i] = chars[i];
    cout << arr[i] << "; ";
  }
  cout << endl;

  delete[] arr;
  return EXIT_SUCCESS;
}

Produzione:

B; a; d; C; T; L; A; R; e; I;

Usa il metodo std::unique_ptr per allocare dinamicamente array in C++

Un altro modo per allocare un array dinamico è usare il puntatore intelligente std::unique_ptr, che fornisce un’interfaccia di gestione della memoria più sicura. Si dice che la funzione unique_ptr possiede l’oggetto che punta; in cambio, l’oggetto viene distrutto una volta che il puntatore esce dall’ambito. Contrariamente ai normali puntatori, il puntatore intelligente non ha bisogno dell’operatore delete per essere chiamato da un programmatore; invece, viene chiamato implicitamente quando l’oggetto viene distrutto.

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

constexpr int SIZE = 10;
static const char chars[] = {'B', 'a', 'd', 'C', 'T', 'L', 'A', 'R', 'e', 'I'};

int main() {
  std::unique_ptr<char[]> arr(new char[SIZE]);

  for (int i = 0; i < SIZE; ++i) {
    arr[i] = chars[i];
    cout << arr[i] << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

B; a; d; C; T; L; A; R; e; I;

Usa il metodo std::make_unique() per allocare dinamicamente array in C++

La funzione make_unique è un’alternativa più contemporanea per gestire la gestione dinamica della memoria. Questo metodo alloca dinamicamente un oggetto di un dato tipo e restituisce il puntatore intelligente std::unique_ptr. Il tipo di oggetto viene specificato come il parametro del modello. D’altra parte, l’array char di dimensione fissa viene allocato e assegnato alla variabile di tipo auto nel seguente esempio:

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

constexpr int SIZE = 10;
static const char chars[] = {'B', 'a', 'd', 'C', 'T', 'L', 'A', 'R', 'e', 'I'};

int main() {
  auto arr = std::make_unique<char[]>(SIZE);

  for (int i = 0; i < SIZE; ++i) {
    arr[i] = chars[i];
    cout << arr[i] << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

B; a; d; C; T; L; A; R; e; I;
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Array