Les 10 erreurs courantes en C++ et comment les éviter

C++ est un langage puissant mais complexe, et même les développeurs expérimentés peuvent tomber dans certains pièges. Voici 10 erreurs courantes en C++ et des conseils pour les éviter.

1. Oublier de libérer la mémoire dynamique

❌ Erreur

L’oubli d’un delete ou delete[] après un new entraîne une fuite mémoire.

cppCopierModifierint* ptr = new int(10);
// Oubli de delete -> fuite mémoire

✅ Solution

Utilise std::unique_ptr ou std::shared_ptr au lieu de new et delete.

cppCopierModifier#include <memory>
std::unique_ptr<int> ptr = std::make_unique<int>(10);

2. Accéder à une mémoire libérée (Dangling Pointer)

❌ Erreur

cppCopierModifierint* ptr = new int(5);
delete ptr;
std::cout << *ptr; // Comportement indéfini

✅ Solution

Toujours remettre le pointeur à nullptr après delete.

cppCopierModifierdelete ptr;
ptr = nullptr;

3. Déréférencer un pointeur nul

❌ Erreur

cppCopierModifierint* ptr = nullptr;
std::cout << *ptr; // Segmentation fault

✅ Solution

Toujours vérifier si le pointeur est valide avant de l’utiliser.

cppCopierModifierif (ptr) {
    std::cout << *ptr;
}

4. Erreur d’indexation d’un tableau

❌ Erreur

cppCopierModifierint arr[5] = {1, 2, 3, 4, 5};
std::cout << arr[5]; // Dépassement de tableau

✅ Solution

Toujours s’assurer que l’index est dans les limites du tableau.

cppCopierModifierif (index >= 0 && index < 5) {
    std::cout << arr[index];
}

Utilise std::vector qui gère la vérification des limites avec .at().


5. Mauvaise gestion des références et copies d’objets

❌ Erreur

cppCopierModifierstd::string s1 = "Hello";
std::string& s2 = s1; // OK
std::string& s3 = "World"; // ERREUR : référence sur une constante temporaire

✅ Solution

Utilise const std::string& pour éviter des copies inutiles et accepter les temporaires.

cppCopierModifiervoid print(const std::string& str) {
    std::cout << str;
}

6. Utilisation incorrecte des opérateurs == et =

❌ Erreur

cppCopierModifierint a = 5;
if (a = 10) {  // ERREUR : affectation au lieu de comparaison
    std::cout << "Toujours vrai!";
}

✅ Solution

Utilise == pour comparer et = pour affecter.

cppCopierModifierif (a == 10) {
    std::cout << "Correct!";
}

7. Mauvaise gestion des exceptions

❌ Erreur

cppCopierModifierthrow "Erreur"; // Mauvaise pratique : utiliser une chaîne brute

✅ Solution

Toujours utiliser std::exception ou des classes dérivées.

cppCopierModifier#include <stdexcept>
throw std::runtime_error("Erreur détectée");

8. Dépendance circulaire dans les fichiers d’en-tête

❌ Erreur

cppCopierModifier// fichierA.h
#include "fichierB.h"
// fichierB.h
#include "fichierA.h" // Boucle infinie

✅ Solution

Utilise les gardes d’inclusion (#ifndef) ou #pragma once.

cppCopierModifier#ifndef FICHIER_H
#define FICHIER_H
// Code
#endif

9. Mauvaise utilisation de std::endl

❌ Erreur

cppCopierModifierstd::cout << "Hello" << std::endl; // Vide le buffer inutilement

✅ Solution

Utilise "\n" sauf si un flush est nécessaire.

cppCopierModifierstd::cout << "Hello\n";

10. Mauvaise utilisation des boucles for avec auto

❌ Erreur

cppCopierModifierstd::vector<int> vec = {1, 2, 3};
for (auto x : vec) { 
    x *= 2;  // Ne modifie PAS les éléments du tableau
}

✅ Solution

Utilise auto& pour modifier les éléments.

cppCopierModifierfor (auto& x : vec) { 
    x *= 2;
}

Conclusion

Éviter ces erreurs permet d’améliorer la fiabilité et la performance de ton code en C++. 🚀 Prends l’habitude d’utiliser les pointeurs intelligents, les containers STL et la gestion stricte des exceptions pour éviter les pièges classiques.

carle
carle