Maison  >  Article  >  développement back-end  >  Comment résoudre l'erreur d'exécution C++ : « accès à la mémoire désallouée » ?

Comment résoudre l'erreur d'exécution C++ : « accès à la mémoire désallouée » ?

王林
王林original
2023-08-26 14:28:571122parcourir

如何解决C++运行时错误:'accessing deallocated memory'?

Comment résoudre l'erreur d'exécution C++ : « accès à la mémoire désallouée » ?

【Introduction】
En programmation C++, diverses erreurs sont souvent rencontrées. L'un d'eux est une erreur d'exécution lors de l'accès à la mémoire libérée : « accès à la mémoire désallouée ». Lorsqu'un programme tente d'accéder à la mémoire libérée, cela provoque un comportement imprévisible et des plantages du programme. Cet article explique les causes de cette erreur et comment l'éviter et la résoudre.

【Raison de l'erreur】
L'accès à la mémoire libérée est une erreur de programmation courante, notamment en C++. Cette erreur se produit généralement dans les circonstances suivantes :

  1. L'accès au pointeur continue après avoir été libéré ;
  2. Le pointeur n'est pas initialisé ou pointe vers une adresse mémoire invalide ;
  3. Le même bloc de mémoire est libéré plusieurs fois ;

【Solution】

  1. Assurez-vous que le pointeur continue d'être accessible après sa libération :
    En C++, nous devons gérer manuellement la mémoire, y compris libérer la mémoire allouée dynamiquement. Lorsque nous utilisons le mot-clé delete pour libérer de la mémoire, nous devons nous assurer que le pointeur libéré n'est plus accessible. Après avoir libéré la mémoire, définir le pointeur sur un pointeur nul peut nous aider à éviter cette erreur.
    Exemple de code :

    int* ptr = new int;
    delete ptr;
    ptr = nullptr; // 将指针设置为空指针
  2. Assurez-vous que le pointeur est correctement initialisé et pointe vers une adresse mémoire valide :
    Avant d'utiliser un pointeur, vous devez vous assurer que le pointeur a été correctement initialisé et pointe vers une adresse mémoire valide. Dans les cas où le pointeur n'est pas initialisé ou pointe vers une adresse mémoire non valide, nous pouvons éviter cette erreur en allouant dynamiquement de la mémoire.
    Exemple de code :

    int* ptr = nullptr; //初始化为空指针
    ptr = new int; //分配内存
    *ptr = 10; //指针现在指向有效的内存地址
  3. Évitez de libérer la même mémoire plusieurs fois :
    En C++, libérer la même mémoire plusieurs fois peut conduire à un comportement indéfini. Afin d'éviter cette situation, nous pouvons vérifier si le pointeur est vide avant d'utiliser le mot-clé delete.
    Exemple de code :

    int* ptr = new int;
    delete ptr;
    ptr = nullptr; 
    // 为了避免多次释放同一块内存,我们可以在delete之前添加条件判断
    if (ptr != nullptr) {
     delete ptr;
     ptr = nullptr;
    }
  4. Remarques lors de l'utilisation de tableaux dynamiques :
    Lorsque nous utilisons des tableaux dynamiques, nous devons utiliser le mot-clé delete[] pour libérer de la mémoire, plutôt qu'un mot-clé delete distinct. En effet, la mémoire allouée par le tableau dynamique est demandée via new[], et non new. De même, nous devons également nous assurer que le pointeur libéré n’est plus accessible.
    Exemple de code :

    int* arr = new int[10];
    delete[] arr;
    arr = nullptr;

【Résumé】
Éviter l'accès à la mémoire libérée est un problème important dans la programmation C++. En gérant correctement les pointeurs, en initialisant et en libérant correctement la mémoire, et en évitant de libérer la même mémoire plusieurs fois, nous pouvons prévenir et résoudre efficacement les erreurs d'exécution « accès à la mémoire désallouée ». Lorsque vous utilisez de la mémoire allouée dynamiquement, vous devez agir avec prudence pour éviter les fuites de mémoire et les pointeurs invalides, et pour améliorer la stabilité et la fiabilité du programme.

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