Maison >développement back-end >C++ >Comment éviter les problèmes de mémoire lors de l'allocation dynamique d'un tableau d'objets en C ?

Comment éviter les problèmes de mémoire lors de l'allocation dynamique d'un tableau d'objets en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 06:52:17773parcourir

How to Avoid Memory Issues When Dynamically Allocating an Array of Objects in C  ?

Allocation dynamique d'un tableau d'objets

Lorsque vous travaillez avec des objets contenant des tableaux alloués dynamiquement, la création d'un tableau complet de ces objets peut présenter des défis . Utiliser une approche simple comme :

A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i) {
    arrayOfAs[i] = A(3);
}

entraîne des problèmes de mémoire car les objets A détruits dans la boucle suppriment leurs tableaux myArray internes, rendant les éléments du tableau de arrayOfAs invalides.

Pour éviter ces problèmes problèmes, comprendre la « règle de 4 » (ou la « règle de 5 » étendue en C 11) est cruciale pour les classes contenant des matières premières pointeurs :

  1. Constructeur
  2. Destructeur
  3. Constructeur de copie
  4. Opérateur d'affectation
  5. Constructeur de déplacement (C 11)
  6. Déplacer l'affectation (C 11)

S'ils ne sont pas définis, le compilateur génère ses propres versions de ces méthodes, qui peuvent ne pas convenir aux pointeurs bruts.

Pour résoudre l'erreur susmentionnée, les exigences minimales pour une classe contenant un pointeur vers un tableau inclut :

class A {
    size_t mSize;
    int* mArray;
public:
    A(size_t s = 0) {mSize=s;mArray = new int[mSize];}
    ~A() {delete [] mArray;}

    A(A const& copy) {
        mSize = copy.mSize;
        mArray = new int[copy.mSize];
        // Handle copying of integers/other members
    }

    A& operator=(A other) {
        std::swap(mArray, other.mArray);
        std::swap(mSize, other.mSize);
        return *this;
    }
};

Alternativement, l'utilisation de conteneurs standard comme std::vector peut simplifier le processus, car ils gèrent la gestion de la mémoire automatiquement :

class A {
    std::vector<int> mArray;
public:
    A(){}
    A(size_t s) :mArray(s)  {}
};

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