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

Visual C++ Discussion :

Probleme avec les conteneurs sur visual c++ 2005 express


Sujet :

Visual C++

  1. #21
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Par défaut
    Salut, Bonne Année 2008 à tous, et merci pour vos réponses. J'ai trouvé le problème : en fait, si la fonction cause un arrêt, c'est parce que g.Wmesh n'est pas crée à cause d'une corruption du tas ("Heap corruption") mais je ne sais pas à quoi cela est dû. Je mets ici un pseudo code de la partie à problème:
    for(int n = 0; n < une_certaine_valeur; ++n)
    {
    for(int a = 0; a < une_autre_valeur; ++a)
    {
    buildSubMesh(); //une de mes fonctions
    }
    }
    void buildSubMesh()
    {
    ID3DXMesh** Temp = new ID3DXMesh*; //ID3DXMesh* est le type de gWmesh
    ...
    HR(D3DXCreateMesh(....,....,......Temp));
    ....
    ...
    ...
    SubGrid g; //SubGrid une structure contenant un ID3DXMesh*
    g.Wmesh = (*Temp);
    mSubGrids.push_back(g); // mSubGrids le fameux vector de SubGrid qui n'était pour rien
    delete Temp;
    }
    Voilà; pour a=0 et a=1 tout se déroule correctement la macro HR(x) voit des S_OK mais, pour a=3, "ID3DXMesh** Temp = new ID3DXMesh*;" est exécuté correctement et dès la validation de CreateMesh, dans la fenêtre de sortie, il est écrit "Heap corruption" et HR(x) voit un E_OUTOFMEMORY(mais l'execution ne sera arrêtée que plus tard).
    Même en activant le mode debug je n'est pas plus de précision sur mon code, à part que l'exécution s'arrête aussitôt le problème rencontré et m'envoie sur
    cette partie du code du fichier(fourni avec le sdk ou visual c++) xutility :
    template<class _InIt> inline
    void __CLRCALL_OR_CDECL _Debug_range(_InIt _First, _InIt _Last, const wchar_t *_File, unsigned int _Line)
    { // test iterator pair for valid range
    là-> _Debug_range2(_First, _Last, _File, _Line, _Iter_cat(_First));
    }

    Normalement, si j'alloue de la memoire dans le tas dans une fonction à l'aide de new, utiliser delete libère cet espace et le fait que ce soit local n'est-il pas censé garantir qu'à chaque appel de "buildSubMesh()" "Temp" n'ait rien à voir avec les précedents ?
    Je ne comprend vraiment plus rien.

  2. #22
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Salut et très bonne année à toi aussi !

    En attendant une réponse pplus sure, voici déjà quelque chose qui me choque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void buildSubMesh()
    {
    ID3DXMesh** Temp = new ID3DXMesh*; //ID3DXMesh* est le type de gWmesh
    ...
    HR(D3DXCreateMesh(....,....,......Temp));
    ....
    ...
    ...
    SubGrid g; //SubGrid une structure contenant un ID3DXMesh*
    g.Wmesh = (*Temp);
    mSubGrids.push_back(g); // mSubGrids le fameux vector de SubGrid qui n'était pour rien
    delete Temp;
    }
    Je parierai que l'erreur est ici.

    Tu dis "SubGrid est une structure contenant un ID3DXMesh*". Or en C++ structure == classe. Le souci est que cette classe contient un pointeur. L'objet g est crée dans la fonction et sera détruit dans la fonction. ll utilise le constructeur de copie. Si tu n'en as pas spécifié, il va simplement faire une copie rigoureuse membre à membre de Temp.

    Donc le(s) pointeur(s) que contient g pointeront sur la meme zone de mémoire que Temp. Ensuite le pushback fait une copie de g. Donc dans le vecteur, l'élément que tu ajoutes pointe toujours vers la zone de Temp.

    Or Temp est crée dynamiquement et tu le détruis après le pushback. Donc la zone pointée par l'élément dans le tableau devrait être invalide non?

  3. #23
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Par défaut
    Merci pour l'indication, j'ai modifié cette partie du code, elle se présent maintenant comme ceci:
    mSubGrids.resize(nbre_par_col*nbre_par_ligne); // toujours mon vector de structure SubGrid
    int p = 0;
    for(int n = 0; n < nbre_par_col; ++n)
    {
    for(int a = 0; a< nbre_par_ligne; ++a)
    {
    buildSubMesh(mSubGrids[p].Wmesh);//Wmesh est toujours un ID3DXMesh*
    p += 1;
    }
    }

    void buildSubMesh(ID3DXMesh* pMesh)
    {
    pMesh = 0;
    ...
    HR(D3DXCreateMesh(...., ....,.....&pMesh));
    ....
    ....
    }
    Mais, j'ai toujours le même problème de corruption du tas et E_OUTOFMEMORY par HR(x).

Discussions similaires

  1. Problem rencontré avec Les DataSet dans Visual Studio 2005?
    Par mehdi_scofield dans le forum ASP.NET
    Réponses: 0
    Dernier message: 14/11/2008, 12h40
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 17h55
  3. boost - Probleme avec compilateur C++ de visual studio 2005
    Par gilles641 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 24/01/2006, 20h03
  4. probleme avec les string sur ITA2 64 bits!
    Par vince3320 dans le forum SL & STL
    Réponses: 5
    Dernier message: 22/08/2005, 20h59
  5. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 23h50

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