Le mécanisme de pointeur intelligent C++ est un mécanisme qui gère automatiquement les pointeurs vers la mémoire tas pour éviter les fuites de mémoire et les pointeurs suspendus. Incluant principalement unique_ptr (propriété unique), shared_ptr (propriété partagée) et faible_ptr (référence faible). Il fournit des fonctions telles que la libération automatique de la mémoire et la vérification de la validité du pointeur, simplifiant la gestion de la mémoire et améliorant la sécurité du code.
Mécanisme de pointeur intelligent C++
Introduction
C++ Smart Pointer est un mécanisme qui gère automatiquement les pointeurs vers la mémoire de tas, simplifiant la gestion de la mémoire et évitant les problèmes tels que les fuites de mémoire et les pointeurs suspendus. Les pointeurs intelligents encapsulent les pointeurs bruts et fournissent des fonctionnalités supplémentaires, telles que la libération automatique de la mémoire et la vérification de la validité du pointeur.
Concepts clés
Implémentation
#include <memory> // 使用 unique_ptr std::unique_ptr<int> uptr = std::make_unique<int>(10); *uptr = 20; // 使用 shared_ptr std::shared_ptr<std::vector<int>> sptr = std::make_shared<std::vector<int>>(); sptr->push_back(1); sptr->push_back(2); // 使用 weak_ptr std::weak_ptr<int> wptr(uptr); if (auto sptr2 = wptr.lock()) { *sptr2 = 30; }
Cas pratique
Exemple 1 : Prévenir les fuites de mémoire
Le code suivant utilise des pointeurs bruts pour gérer la mémoire allouée dynamiquement. Si vous libérez accidentellement de la mémoire manuellement, une fuite de mémoire peut se produire.
int* ptr = new int(10); // ... delete ptr; // 必须记住释放内存
L'utilisation de pointeurs intelligents peut éviter ce problème :
std::unique_ptr<int> uptr = std::make_unique<int>(10); // ... // uptr 会自动在析构时释放内存
Exemple 2 : Propriété partagée
Considérez la situation suivante, où les deux fonctions utilisent la même chaîne allouée dynamiquement. Les pointeurs bruts n'autorisent pas la propriété partagée, ce qui peut entraîner des erreurs de programme :
char* strPtr = new char[100]; void func1() { // 使用 strPtr } void func2() { // 也使用 strPtr }
L'utilisation de shared_ptr peut résoudre ce problème :
std::shared_ptr<char[]> strPtr = std::make_shared<char[]>(100); void func1() { // 使用 strPtr } void func2() { // 也使用 strPtr }
Avantages
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!