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
idelete
: 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ó
int* ptr = new int;
: Reserva memòria per a un enter i retorna un punter a aquesta memòria.*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ó
delete ptr;
: Allibera la memòria reservada perptr
.ptr = nullptr;
: Assignanullptr
aptr
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ó
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;
: Assignanullptr
aarr
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
odelete[]
. - 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.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil