Pointeurs et mémoire

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++

C
Exécuter →
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;
}
Résultat attendu
last=16
C++
Exécuter →
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';
}
Résultat attendu
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.