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 :
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!