Introducció

L'assignació dinàmica de memòria és una tècnica fonamental en C++ que permet als programes sol·licitar memòria durant l'execució. Això és especialment útil quan no es coneix la quantitat exacta de memòria necessària fins que el programa està en funcionament. En aquest tema, aprendrem com utilitzar les funcions new i delete per gestionar la memòria dinàmica.

Conceptes Clau

  • Memòria Estàtica vs Dinàmica: La memòria estàtica es reserva en temps de compilació, mentre que la memòria dinàmica es reserva en temps d'execució.
  • Operadors new i delete: Utilitzats per reservar i alliberar memòria dinàmica respectivament.
  • Fuites de Memòria: Errors que es produeixen quan la memòria dinàmica no es allibera correctament.

Operador new

L'operador new s'utilitza per reservar memòria dinàmica. Retorna un punter al tipus de dades especificat.

Exemple

int* ptr = new int; // Reserva memòria per a un enter
*ptr = 10; // Assigna el valor 10 a la memòria reservada

Explicació

  1. int* ptr = new int;: Reserva memòria per a un enter i retorna un punter a aquesta memòria.
  2. *ptr = 10;: Assigna el valor 10 a la memòria reservada.

Operador delete

L'operador delete s'utilitza per alliberar la memòria dinàmica reservada amb new.

Exemple

delete ptr; // Allibera la memòria reservada per a l'enter
ptr = nullptr; // Bona pràctica: assignar nullptr després d'alliberar la memòria

Explicació

  1. delete ptr;: Allibera la memòria reservada per ptr.
  2. ptr = nullptr;: Assigna nullptr a ptr per evitar accessos a memòria alliberada.

Arrays Dinàmics

També podem reservar memòria per a arrays dinàmics utilitzant new[] i alliberar-la amb delete[].

Exemple

int* arr = new int[5]; // Reserva memòria per a un array de 5 enters
for (int i = 0; i < 5; ++i) {
    arr[i] = i * 2; // Assigna valors a l'array
}
delete[] arr; // Allibera la memòria reservada per l'array
arr = nullptr; // Bona pràctica: assignar nullptr després d'alliberar la memòria

Explicació

  1. int* arr = new int[5];: Reserva memòria per a un array de 5 enters.
  2. for (int i = 0; i < 5; ++i) { arr[i] = i * 2; }: Assigna valors a l'array.
  3. delete[] arr;: Allibera la memòria reservada per l'array.
  4. arr = nullptr;: Assigna nullptr a arr per evitar accessos a memòria alliberada.

Exercicis Pràctics

Exercici 1

Reserva memòria dinàmica per a un enter, assigna-li un valor i després allibera la memòria.

Solució

#include <iostream>
int main() {
    int* ptr = new int; // Reserva memòria
    *ptr = 42; // Assigna valor
    std::cout << "Valor: " << *ptr << std::endl; // Mostra el valor
    delete ptr; // Allibera memòria
    ptr = nullptr; // Assigna nullptr
    return 0;
}

Exercici 2

Reserva memòria dinàmica per a un array de 10 enters, assigna valors a l'array i després allibera la memòria.

Solució

#include <iostream>
int main() {
    int* arr = new int[10]; // Reserva memòria per a un array de 10 enters
    for (int i = 0; i < 10; ++i) {
        arr[i] = i + 1; // Assigna valors
    }
    for (int i = 0; i < 10; ++i) {
        std::cout << arr[i] << " "; // Mostra els valors
    }
    std::cout << std::endl;
    delete[] arr; // Allibera memòria
    arr = nullptr; // Assigna nullptr
    return 0;
}

Errors Comuns i Consells

  • Fuites de Memòria: Sempre assegura't d'alliberar la memòria dinàmica amb delete o delete[].
  • Accés a Memòria Alliberada: Després d'alliberar la memòria, assigna nullptr al punter per evitar accessos accidentals.
  • No Alliberar Memòria: No alliberar la memòria pot causar que el programa utilitzi més memòria de la necessària, la qual cosa pot portar a un mal rendiment o fins i tot a que el programa es quedi sense memòria.

Conclusió

L'assignació dinàmica de memòria és una eina poderosa en C++ que permet una gestió flexible de la memòria. És important utilitzar correctament els operadors new i delete per evitar fuites de memòria i altres errors relacionats amb la gestió de memòria. Amb la pràctica, esdevindràs més còmode treballant amb memòria dinàmica i podràs escriure programes més eficients i robustos.

© Copyright 2024. Tots els drets reservats