Maison  >  Article  >  développement back-end  >  Pointeurs intelligents C++ : des bases à l'avancé

Pointeurs intelligents C++ : des bases à l'avancé

WBOY
WBOYoriginal
2024-05-09 21:27:02879parcourir

Les pointeurs intelligents sont des pointeurs spécifiques au C++ qui peuvent automatiquement libérer des objets de mémoire tas et éviter les erreurs de mémoire. Les types incluent : unique_ptr : propriété exclusive, pointant vers un seul objet. shared_ptr : propriété partagée, permettant à plusieurs pointeurs de gérer des objets en même temps. faible_ptr : référence faible, n'augmente pas le nombre de références et évite les références circulaires. Utilisation : créez des pointeurs intelligents en utilisant make_unique, make_shared et make_weak de l'espace de noms std. Les pointeurs intelligents libèrent automatiquement la mémoire des objets à la fin de la portée. Utilisation avancée : vous pouvez utiliser des suppresseurs personnalisés pour contrôler la manière dont les objets sont libérés. Les pointeurs intelligents peuvent gérer efficacement les tableaux dynamiques et empêcher les fuites de mémoire.

C++ 智能指针:从基础到高级

De base à avancé : les pointeurs intelligents C++

Introduction

Les pointeurs intelligents sont des pointeurs spéciaux en C++ conçus pour résoudre la gestion de la mémoire. Ils évitent efficacement les erreurs de mémoire courantes causées par la gestion manuelle de la mémoire, telles que les fuites de mémoire et les pointeurs suspendus, en libérant automatiquement l'espace sur la mémoire tas où le pointeur pointe vers l'objet.

Types

Il existe plusieurs types de pointeurs intelligents en C++, chacun avec ses propres fonctionnalités et utilisations uniques :

  • unique_ptr : Un pointeur intelligent de propriété exclusive qui pointe vers un objet qui ne peut être géré que par un seul pointeur. .
  • shared_ptr : Un pointeur intelligent à propriété partagée, permettant à plusieurs pointeurs de gérer le même objet en même temps.
  • weak_ptr : Pointeur intelligent de référence faible, qui n'augmente pas le nombre de références de l'objet et est utilisé pour éviter les références circulaires.

Utilisation de base

Pour créer un pointeur intelligent, utilisez simplement le modèle de type correspondant dans l'espace de noms std : std 命名空间中的相应类型模板:

// 独占所有权
unique_ptr<int> p1 = make_unique<int>(42);

// 共享所有权
shared_ptr<int> p2 = make_shared<int>(10);

// 弱引用
weak_ptr<int> p3 = p2;

释放内存

智能指针会在其作用域结束时自动释放所指向的对象。因此,不需要手动调用 deletefree

实战案例:动态数组管理

使用智能指针管理动态数组,可以避免因忘记手动释放空间而导致的内存泄漏:

// 普通的动态数组管理
int* arr = new int[100];

// 智能指针管理动态数组
unique_ptr<int[]> arr = make_unique<int[]>(100);

arr 超出其作用域时,智能指针会自动删除数组。这确保了在所有情况下都释放了资源。

高级用法:自定义删除器

某些情况下,可能需要使用自定义删除器来控制指针指向对象的释放方式。这可以通过重载 delete

class MyObject {
public:
    ~MyObject() {
        // 自定义删除逻辑
    }
};

int main() {
    unique_ptr<MyObject, decltype(&MyObject::delete)> p = make_unique<MyObject>(&MyObject::delete);
}

Libérer de la mémoire

Les pointeurs intelligents se termineront automatiquement à la fin de leur portée Relâchez l'objet pointu. Par conséquent, il n'est pas nécessaire d'appeler manuellement delete ou free.

🎜Cas pratique : gestion des tableaux dynamiques🎜🎜🎜Utilisez des pointeurs intelligents pour gérer les tableaux dynamiques afin d'éviter les fuites de mémoire causées par l'oubli de libérer manuellement de l'espace : 🎜rrreee🎜Lorsque arr dépasse sa portée, les pointeurs intelligents automatiquement supprimer des tableaux. Cela garantit que les ressources sont libérées dans tous les cas. 🎜🎜🎜Utilisation avancée : Suppresseur personnalisé 🎜🎜🎜Dans certains cas, vous devrez peut-être utiliser un suppresseur personnalisé pour contrôler la façon dont l'objet pointé par le pointeur est libéré. Ceci peut être réalisé en surchargeant l'opérateur delete : 🎜rrreee🎜🎜Conclusion🎜🎜🎜En incorporant des pointeurs intelligents dans les bases de code C++, les développeurs peuvent améliorer considérablement l'efficacité de la gestion de la mémoire tout en évitant les erreurs courantes. Cela permet de créer des applications plus robustes et plus fiables. 🎜

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn