Blog Alphorm Logo de blog informatique spécialisé en technologie et solutions IT
  • Développement
  • 3D et Animation
  • Cybersécurité
  • Infrastructure
  • Virtualisation
  • Réseaux
  • Bureautique
  • BDD
En cours de lecture : Découvrez std::shared_ptr en C++
Agrandisseur de policeAa
Blog AlphormBlog Alphorm
  • Développement
  • 3D et Animation
  • Cybersécurité
  • Infrastructure
  • Virtualisation
  • Réseaux
  • Bureautique
  • BDD
Search
  • Développement
  • 3D et Animation
  • Cybersécurité
  • Infrastructure
  • Virtualisation
  • Réseaux
  • Bureautique
  • BDD
Suivez-nous
© Alphorm 2024 - Tous droits réservés
Développement

Découvrez std::shared_ptr en C++

L'Équipe Alphorm Par L'Équipe Alphorm 15 janvier 2025
Partager
Partager

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é.

Table de matière
Introduction à std::shared_ptr en C++Gestion mémoire avec std::shared_ptrExemple pratique de std::shared_ptrConclusion sur std::shared_ptr en C++FAQConclusion

Formation Initiation Programmation C++ : Les fondamentaux

Maîtrisez le C++ en créant un jeu console et boostez vos compétences

Découvrir cette formation

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.

Illustration de std::shared_ptr avec référence

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 <memory>
#include <iostream>
int main() {
auto ptr = std::make_shared<int>(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.
Astuce Pratique :
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 :

Console Visual Studio avec std::shared_ptr C++

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);
}

				
			
Erreur Courante :
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 <iostream>
#include <memory>
#include <vector>
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<std::shared_ptr<Case>> cases;
for (int i = 0; i < 3; ++i) {
cases.push_back(std::make_shared<Case>(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 :

Console Visual Studio affichant des logs C++

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.

Démarrer gratuitement
illustration processus de paiement en ligne avec étapes claires et convivialité

FAQ

Comment fonctionne std::shared_ptr en C++?
std::shared_ptr est un pointeur intelligent en C++ qui permet à plusieurs entités de partager une même ressource. Il gère automatiquement la mémoire en maintenant un compteur de références qui suit le nombre de pointeurs pointant vers l’objet. Lorsqu’aucun std::shared_ptr ne référence l’objet, la mémoire est automatiquement libérée, éliminant ainsi les fuites de mémoire et simplifiant la gestion des ressources dans les applications C++.
Pourquoi utiliser std::make_shared avec std::shared_ptr?
std::make_shared est utilisé avec std::shared_ptr pour simplifier le processus de création d’un pointeur intelligent. Il alloue la ressource et le compteur de références en une seule étape, ce qui réduit le risque d’erreurs lors de l’initialisation. En favorisant std::make_shared, vous optimisez les performances et la sécurité de votre code, car cela garantit une allocation efficace et sécurisée des ressources en mémoire.
Quelle est la différence entre std::shared_ptr et std::unique_ptr?
La principale différence entre std::shared_ptr et std::unique_ptr réside dans la gestion de la propriété des ressources. std::shared_ptr permet le partage de la propriété d’une ressource entre plusieurs entités grâce à un compteur de références, tandis que std::unique_ptr assure une propriété unique et ne peut pas être copié. std::unique_ptr est plus léger et convient aux ressources non partagées, alors que std::shared_ptr est idéal pour les ressources partagées.
Quels sont les avantages de std::shared_ptr pour les structures complexes?
std::shared_ptr est particulièrement avantageux pour les structures complexes comme les graphes ou les structures imbriquées, où plusieurs entités doivent accéder à la même ressource. Il assure une gestion sûre et automatisée de la mémoire, évitant les fuites et les accès invalides. Le compteur de références intégré garantit que les ressources ne sont libérées que lorsqu’elles ne sont plus nécessaires, simplifiant ainsi le développement et la maintenance du code.
Comment std::shared_ptr améliore-t-il la gestion de la mémoire dans les jeux?
Dans le développement de jeux, std::shared_ptr améliore la gestion de la mémoire en permettant de partager des ressources comme les cases d’un plateau de jeu entre plusieurs entités, tout en assurant une libération automatique de la mémoire. Cela réduit le besoin de gestion manuelle avec new et delete, diminuant ainsi le risque de fuites de mémoire et d’erreurs, et rendant le code plus robuste et facile à maintenir.

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

ÉTIQUETÉ : Langage C++
Facebook
Twitter
LinkedIn
Email
WhatsApp
Par L'Équipe Alphorm
Démocratiser la Connaissance Informatique pour Tous !
Suivre :
L'Équipe Alphorm, c'est la démocratisation de la connaissance informatique. Passionnés et dévoués, nous sommes là pour vous guider vers le succès en rendant la technologie accessible à tous. Rejoignez notre aventure d'apprentissage et de partage. Avec nous, le savoir IT devient une ressource inspirante et ouverte à tous dans un monde numérique en constante évolution.

Derniers Articles

  • Techniques pour gérer les fichiers texte en C#
  • Créer et lire un fichier CSV avec C#
  • JSON : Comprendre et Utiliser Efficacement
  • Créer une Base SQLite dans C#
  • Lecture des données SQLite simplifiée
Laisser un commentaire Laisser un commentaire

Laisser un commentaire Annuler la réponse

Vous devez vous connecter pour publier un commentaire.

Blog Alphorm
  • Développement
  • 3D et Animation
  • Cybersécurité
  • Infrastructure
  • Virtualisation
  • Réseaux
  • Bureautique
  • BDD
En cours de lecture : Découvrez std::shared_ptr en C++

© Alphorm - Tous droits réservés