La gestion de la mémoire dynamique en C++ est complexe et sujette aux erreurs.
Les erreurs courantes incluent les fuites de mémoire et les accès invalides, compromettant les performances.
L’article explore comment std::shared_ptr et std::make_shared offrent une solution efficace pour gérer la mémoire en toute sécurité.
Maîtrisez le C++ en créant un jeu console et boostez vos compétences

Introduction à std::shared_ptr en C++
La gestion de la mémoire dynamique est un aspect critique de la programmation en C++, car elle affecte directement la performance, la fiabilité et la maintenabilité des applications. Les pointeurs bruts traditionnels (raw pointers) laissent les développeurs responsables de l’allocation et de la libération de la mémoire, ce qui peut entraîner des erreurs courantes telles que les fuites mémoire ou les accès invalides.
Pour remédier à cela, les
smart pointers
ont été introduits dans les normes modernes de C++ (C++11 et C++14). Ces outils fournissent une manière sûre et efficace de gérer les ressources mémoire. Ce e-book explore deux des types principaux, std::unique_ptr et std::shared_ptr, et leur
Gestion mémoire avec std::shared_ptr
Présentation de std::shared_ptr
std::shared_ptr est conçu pour permettre à plusieurs entités de partager la propriété d’une même ressource. Contrairement à std::unique_ptr, il maintient un compteur de références interne qui suit le nombre de std::shared_ptr pointant vers la ressource. Une fois que toutes les copies sont détruites, la ressource est automatiquement libérée.
Scénarios typiques :
- Partage de données entre threads :Un std::shared_ptr est souvent utilisé pour des ressources accessibles par plusieurs threads.
- Structures complexes :Dans des graphes ou autres structures imbriquées, les std::shared_ptr permettent de partager des objets sans ambiguïté sur leur durée de vie.
Construction avec std::make_shared
std::make_shared est une fonction utilitaire qui simplifie la création d’un std::shared_ptr. Elle alloue une ressource et son compteur de référence en une seule étape, réduisant ainsi le risque d’erreurs.
Exemple pratique :
#include
#include
int main() {
auto ptr = std::make_shared(42); // Crée un `std::shared_ptr` pour un entier
std::cout << "Valeur : " << *ptr << std::endl;
auto ptr2 = ptr; // Partage de la ressource
std::cout << "Compteur de références : " << ptr.use_count() << std::endl;
return 0;
}
Explication :
- ptr et ptr2 partagent la même ressource.
- Le compteur de références (use_count()) indique combien de std ::shared_ptr pointent vers la ressource.
Préférez systématiquement std::make_shared pour des raisons de performance et de sécurité.
Vérifiez toujours la validité du pointeur avec if (ptr) avant de l’utiliser.
Exemple d’exécution :
Comparaison entre std::shared_ptr et std::unique_ptr
Bien que std::shared_ptr soit extrêmement utile pour partager des ressources, il ne remplace pas toujours std::unique_ptr. Le choix dépend des exigences spécifiques de votre projet.
Caractéristique | std::unique_ptr | std::shared_ptr |
---|---|---|
Propriété | Unique | Partagée |
Comptage de références | Non | Oui |
Coût en mémoire | Minimal | Légèrement supérieur (pour gérer les références). |
Utilisation recommandée | Ressources non partagées. | Ressources partagées entre plusieurs entités. |
Exemple pratique de std::shared_ptr
Contexte : Gestion d’un Plateau de Jeu
Dans cet exemple, nous utilisons std::shared_ptr pour gérer les cases d’un plateau de jeu. Chaque joueur peut pointer vers une case partagée. L’objectif est de démontrer que la mémoire des cases est automatiquement libérée lorsqu’elles ne sont plus référencées.
Code avant l’utilisation de std::shared_ptr :
Case* cases[64];
for (int i = 0; i < 64; ++i) {
cases[i] = new Case(i);
}
Besoin explicite de libérer chaque case avec delete.
Risque accru de fuites mémoire si une suppression est oubliée.
Code amélioré avec std::shared_ptr :
Ce code montre comment utiliser efficacement std::shared_ptr pour gérer la mémoire dans le cadre d’un plateau de jeu, remplaçant la gestion manuelle de la mémoire avec new et delete.
#include
#include
#include
class Case {
public:
explicit Case(int id) : id_(id) {
std::cout << "Case " << id_ << " créée." << std::endl;
}
~Case() {
std::cout << "Case " << id_ << " supprimée." << std::endl;
}
private:
int id_;
};
int main() {
std::vector> cases;
for (int i = 0; i < 3; ++i) {
cases.push_back(std::make_shared(i)); // Utilise make_shared pour créer les objets
}
std::cout << "Toutes les cases ont été créées." << std::endl;
return 0;
}
Le code utilise std::shared_ptr avec un std::vector pour gérer efficacement la mémoire des objets Case, en remplaçant les pointeurs bruts. Les objets sont créés avec std::make_shared , ce qui simplifie leur allocation et garantit une libération automatique de la mémoire. Le destructeur affiche un message confirmant la destruction des objets lorsque le dernier pointeur est supprimé. Cette approche élimine les risques de fuite de mémoire et rend le code plus sûr et maintenable.
Exemple d’exécution :
Conclusion sur std::shared_ptr en C++
Les smart pointers révolutionnent la gestion des ressources en C++, offrant à la fois simplicité et sécurité. Tandis que std::unique_ptr garantit une gestion efficace des ressources uniques, std::shared_ptr se distingue dans les scénarios où les ressources doivent être partagées. Comprendre leurs forces et leurs limites est essentiel pour écrire un code robuste et maintenable.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment fonctionne std::shared_ptr en C++?
Pourquoi utiliser std::make_shared avec std::shared_ptr?
Quelle est la différence entre std::shared_ptr et std::unique_ptr?
Quels sont les avantages de std::shared_ptr pour les structures complexes?
Comment std::shared_ptr améliore-t-il la gestion de la mémoire dans les jeux?
Conclusion
Les smart pointers révolutionnent la gestion des ressources en C++, offrant à la fois simplicité et sécurité. Tandis que std::unique_ptr garantit une gestion efficace des ressources uniques, std::shared_ptr se distingue dans les scénarios où les ressources doivent être partagées. Comprendre leurs forces et leurs limites est essentiel pour écrire un code robuste et maintenable. Comment envisagez-vous d’appliquer ces concepts dans vos projets C++?