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 :

Problème d'allocation ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut Problème d'allocation ?
    bonjour,

    j'ai une erreur que je n'explique pas : je charge une image 3D et ensuite j'ai besoin de stocker des valeurs dans un tableau. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System::Void Form1::buttonMaillage_Click(System::Object*  sender, System::EventArgs*  e)
    {
    	trd = new Thread(new ThreadStart(this,&Form1::Maillage3D));
    	trd->IsBackground = true;
    	trd->Start();
    }
    Voici le thread lancé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System::Void Form1::Maillage3D()
    {
    	unsigned char * TabBinaire = new unsigned char[modele->largeur*modele->hauteur*modele->profondeur];
    	int largeur = modele->largeur, hauteur = modele->hauteur, profondeur = modele->profondeur;
    ...
    }
    l'erreur a lieu sur la première ligne de Maillage3D, lors de la création de TabBinaire. L'erreur est la suivante :

    Une exception non gérée du type 'System.Runtime.InteropServices.SEHException' s'est produite dans 3DImagerie.exe

    Informations supplémentaires*: Un composant externe a levé une exception.
    Visual 2005 m'ouvre le fichier onexit.c sur la fonction :

    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
    #pragma warning(suppress: 22008) /* prefast is confused */
                onexitend = p + (onexitend - onexitbegin);
                onexitbegin = p;
                __onexitbegin = (_PVFV *)_encode_pointer(onexitbegin);
            }
     
            /*
             * Put the new entry into the table and update the end-of-table
             * pointer.
             */
             *(onexitend++) = (_PVFV)_encode_pointer(func);
            __onexitend = (_PVFV *)_encode_pointer(onexitend);
     
            return func;
    }
    et m'indique la ligne : __onexitend = (_PVFV *)_encode_pointer(onexitend);

    Le truc bizarre est que quand j'ouvre un fichier plus petit, ca se passe correctement alors qu'en ouvrant un plus gros (comme là) ca plante !

    une idée?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Avant tout, quelle est la valeur de modele->largeur*modele->hauteur*modele->profondeur ? Les allocations ont quand même un limite...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Alors ca fait du 300*299*415 (37.225.500) et celle pour laquelle ca marche fait 63*256*296 (4.773.888).

    Y'a t-il moyen de vérifier que ca ne dépasse pas la taille de la mémoire disponible (faire une condition du type if(larg*haut*prof < Seuil)) ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je ne sais pas si on peut déterminer la taille maximale que l'on peut allouer à un moment. Je pense que ça dépend de la taille déjà allouée et du niveau de la pile.

    A titre de debug, tu peux essayer ça (méthode non garantie et faite à la volée) :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    size_t borne_max_a_priori()
    {
       size_t count = 1024;
       double pas(1);
       while(static_cast<size_t>(pas*count)>1)
       {
          try{
             while(1){
                unsigned char *uc = new unsigned char[count];
                delete []uc;
                count+=static_cast<size_t>(pas*count);
             }
          }
          catch(...)
          {
             count=static_cast<size_t>(1.*count/(1.+pas));
             pas/=2;
          }
       }
     
       return count;
    }
    int main()
    {
     
       std::cout<<borne_max_a_priori()<<std::endl;
       return 0;
    }
    Ca te donnera un indicateur.

    Sinon, tu peux trapper l'exception d'allocation si c'est bien ça l'erreur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'allocator
    Par Quark-Up dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 01h37
  2. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23
  3. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  4. fenetre MDI - problème d'allocation
    Par say dans le forum C++Builder
    Réponses: 8
    Dernier message: 03/11/2005, 17h06
  5. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18

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