Gestion de la mémoire dynamique
Le stockage dynamique sert lorsque taille ou durée de vie sont inconnues à la compilation.
Qu’est-ce que Gestion de la mémoire dynamique ?
Le stockage dynamique sert lorsque taille ou durée de vie sont inconnues à la compilation.
Allouez un tableau à l’exécution et libérez-le correctement.
Points importants
- Un pointeur doit viser un objet vivant compatible ou être null.
- Chaque allocation possédée doit être libérée exactement une fois.
- Exprimez clairement ownership et const.
Exemples de code C et C++
main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
size_t count = 5;
int *values = calloc(count, sizeof *values);
if (!values) return 1;
for (size_t i = 0; i < count; ++i) values[i] = (int)(i * i);
printf("last=%d\n", values[count - 1]);
free(values);
return 0;
}
last=16
C++
main.cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> values(5);
for (std::size_t i = 0; i < values.size(); ++i) values[i] = static_cast<int>(i * i);
std::cout << "last=" << values.back() << '\n';
}
last=16
Comparaison entre C et C++
C associe malloc ou calloc à free et vérifie l’échec. std::vector possède sa mémoire, la libère automatiquement et reste sûr face aux exceptions.
C
Ownership et nettoyage sont des conventions gérées manuellement.
C++
Les conteneurs et RAII encodent ownership et nettoyage dans la durée de vie.
Exercices pratiques
Exécutez les deux versions puis modifiez-les pour observer leurs garanties.
- Testez null et les échecs d’allocation.
- Utilisez AddressSanitizer et UndefinedBehaviorSanitizer.
- Documentez l’ownership de chaque pointeur.