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
Libérer: 2024-12-18 06:52:17
original
675 Les gens l'ont consulté

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);
}
Copier après la connexion

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;
    }
};
Copier après la connexion

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)  {}
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal