Bonjour à tous,
j'ai créé une classe template DynamicArray, qui comme son nom l'indique est un tableau dont la taille augmente automatiquement en fonction des besoins. Pour stocker ses éléments, j'utilise un tableau de pointeurs que j'alloue avec new[].
Mon problème est que lorsque j'augmente la taille de ce tableau, parfois mon nouveau tableau écrase le dernier pointeur de l'ancien. Voici le code de la fonction en question :
Par exemple, si le premier tableau, array, a une capacité de 14, il arrive parfois que newArray soit alloué juste après array, ce qui me semble tout à fait normal. Le problème est que systématiquement, il écrit dans les 4 octets devant lui, c'est à dire à la fin de array !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 template <typename T> void DynamicArray<T>::increaseCapacity() throw (DynamicArray<T>::AllocError&) { // Nouveau tableau T** newArray = new T*[capacity + inc]; if (newArray == NULL) throw (AllocError ("Impossible d'accroitre la taille du tableau")); // Nouvelle taille int newCapacity = capacity + inc; // Initialisation du nouveau tableau memset (newArray, 0, newCapacity * sizeof(T*)); memcpy (newArray, array, capacity * sizeof(T*)); // Libération de l'ancien tableau delete [] array; array = newArray; capacity = newCapacity; }
J'aimerais aussi savoir pourquoi ce comportement ne se produit que si la capacité de mon tableau est paire. Quant au nombre écrit, il s'agit du nombre d'octets de mon nouveau tableau + 9.
J'ai résolu ceci en allouant systématiquement 1 élément en plus que la capacité de mon tableau, mais outre que je ne trouve pas ce nouveau code très élégant ni sur, ceci me semble un contournement du problème plus qu'une résolution.
Un grand merci à tous ceux qui peuvent m'éclairer sur ce comportement étrange, du moins pour moi.
PS : Je sais qu'il existe une classe vector dans la STL, mais comme je découvre le C++, j'essaye d'acquérir les bases de ce langage. Je veux donc écrire moi même le plus de choses possibles. Même si ça me prends la tête, je pense de cette manière saisir certaines subtilités de ce langage. Pour cette même raison, si quoi que ce soit dans ma fonction vous choque, n'hésitez pas à m'en faire part.
Partager