IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Allocation de mémoire avec new[] qui écrase mes données


Sujet :

C++

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 144
    Points : 645
    Points
    645
    Par défaut Allocation de mémoire avec new[] qui écrase mes données
    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 :
    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;
    }
    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 !

    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.

  2. #2
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Tu devrais lire cela :
    http://c.developpez.com/faq/cpp/?page=pointeurs

    Et tu comprendras ce qui ne va pas .

    Edit: Et comme je suis dans un bon jour, le lien direct vers la solution :
    http://c.developpez.com/faq/cpp/?page=STL#STL_vector

  3. #3
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 144
    Points : 645
    Points
    645
    Par défaut
    Merci pour la réponse, mais j'avais lu la FAQ sur la mémoire, je viens de la relire, et je ne vois toujours pas d'où vient mon problème.

    Bien qu'après cette deuxième lecture, je me suis penché plus en détails dans les pools de mémoire. Même si je n'en utilise pas, je suppose que le compilateur les utilise. Cependant, s'il stocke la taille de mémoire alloué à l'adresse précédant celle retournée, il devrait au moins tenir compte du fait que cette adresse mémoire est déjà occupée. Peut être alors que je fais un erreur lors de l'allocation.

    Pour allouer un tableau de 10 pointeurs, je fais :
    Si j'ai bien compris la syntaxe du new[], le 10 est le nombre d'élément du tableau, pas le plus grand indice, ceux ci commençant à 0. Mon tableau va donc de t[0] à t[9]. La première case mémoire libre est donc t + 10. Allouer un nouveau tableau ne pourrait se faire qu'à partir de t + 11, t + 10 contenant alors la taille allouée. Or ce qui se passe, est qu'il alloue en t + 10, et mets la taille en t + 9, écrasant du même coup mes données. C'est ça que je ne comprends pas. Et surtout, pourquoi ne le fait-il que si le nombre d'éléments du tableau est pair bon sang

    Quant à la STL, il est certain que je l'utiliserai un jour. Mais pour l'instant, je cherche à acquérir les bases du C++. Je veux donc davantage comprendre l'origine de ce problème que le contourner en utilisant la STL. Après tout, je risque bien de me retrouver avec un problème similaire un jour, sans pour autant qu'il s'agisse de tableau dynamique.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/11/2013, 14h43
  2. [AC-2007] Requete INSERT INTO qui écrase mes enregistrements
    Par Azomix dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/01/2012, 20h15
  3. Réponses: 3
    Dernier message: 17/01/2011, 19h26
  4. [MySQL] decimale sql qui tronque mes données
    Par Souri84 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/11/2010, 21h49
  5. Bloc mémoire maximum allouable avec new
    Par uriotcea dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/02/2007, 19h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo