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

MFC Discussion :

Allocation de mémoire statique qui échoue


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut Allocation de mémoire statique qui échoue
    Bonjour

    En travaillant sur un projet je me suis trouvé confronté à un problème stupide d'allocation de mémoire en statique.

    Je suis parti d'un projet MFC (boite de dialogue) vide, j'ai ajouté un bouton.
    Dans la fonction qui appelé par le click sur celui ci, j'ai ajouté 2 déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double toto[8192];
    double tata[1572864];
    rien d'extraordinaire.
    Et bien dès que je clique sur le bouton j'ai le droit au message suivant :
    "Unhandled exception in test.exe: 0xC00000FD: Stack Overflow."
    Alors là franchement à part un problème du compilo, je vois pas.
    Si quelqu'un a une idée, je suis preneur.

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    rien d'extraordinaire.
    Pour moi ? C'est une put*** d'erreur de débutant.

    Et bien dès que je clique sur le bouton j'ai le droit au message suivant :
    "Unhandled exception in test.exe: 0xC00000FD: Stack Overflow."
    Si, ce n'était pas le cas, je me poserais sérieusement des questions sur le type d'OS sur lequel le programme tourne.

    Si quelqu'un a une idée, je suis preneur.
    On arrête la mise en boîte. Et puis, cette connerie, tout le monde l'a faite.

    Le problème, c'est qu'un variable locale à une fonction n'est pas allouée dans le tas (comme avec l'utilisation de new ou malloc) mais sur la pile d'exécution du thread. Cela permet de gérer automatiquement et efficacement leur désallocation en sortie de fonction.

    Il y a donc plein de méthodes pour contourner ce problème, comme l'utilisation du tas, de variables locales "statics", de variables globales (mais c'est mal), les tls, etc.

    Mais je ne pense pas qu'une quantité aussi importante de variables locales à une fonction soit très raisonnable.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Première fois que j'entends parler de ce problème.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En admettant que la taille d'un double fasse 8 octets (ce qui est le cas dans mon environnement), tes 2 variables double toto[8192] et double tata[1572864] représentent 12 648 448 soient 12 MO.

    Comme j'ai l'impression que ces variables sont des variables locales, elle sont donc allouées sur la pile. La pile n'est pas faite pour gérer des variables aussi volumineuses et c'est pourquoi tu pars en stack overflow.

    PS : Pour info, dans mon environnement (Visual Studio 2005 sur Seven x64), cela part aussi en stack overflow.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Merci pour cette réponse claire.

    Pour info je suis sous XP avec VC6.

    Donc si je comprends bien, une allocation dynamique et statique (locale à une fonction) ne réservent pas de la mémoire au même endroit.

    En général j'utilise toujours des allocations dynamiques pour mes tableaux et là j'ai voulu aller plus vite en allouant statiquement un buffer de taille fixe (mais importante) et au final j'ai perdu un temps fou à essayer de résoudre le problème.

    Et bien j'ai appris quelque chose.

    Merci.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Attention aui mots que tu emploies. L'explication qui suit n'est pas rigoureuse à 100%, il y a des petits raccourcis simplificateurs, mais elle suffit à dégrossir le problème.

    Une allocation dynamique sous entend que tu utilises malloc ou new pour faire ton allocation. Dans ce cas, la mémoire utilisée est issue du "Tas" ou "Heap" en anglais. Il s'agit d'un segment de mémoire particulier dont le rôle est de gérer tout ce qui est allocation dynamique. L'allocation dynamique est faite lors de l'exécution du code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *ptr = malloc(1000);   // allocation par malloc en C ou C++ (bien que les puristes n'aiment pas malloc() en C++)
    Element *pElement = new Element; // allocation par new en C++
    Une allocation statique est une variable qui est allouée dans un segment de mémoire à part. Il y a aussi les variables globales qui vont dans ce segment de mémoire. Le terme allocation statique est d'ailleurs impropre. C'est plutôt une variable statique. L'allocation est faite lors de la phase de compilation linkage (et aussi lors du chargement du programme par l'OS).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static int variable1;  // une variable statique
    void fonction(void)
    {
    static int variable2;  // une autre variable statique
    }
    Et enfin, il y a les variable locales qui elles sont allouées dans la pile (stack en anglais) qui est un segment de mémoire particulièr qui sert à gérer les paramètres d'appel de fonction, les adresses de retour des fonction et toutes les variables locales. L'allocation de la variables est faite au moment de l'exécution de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fonction(void)
    {
    char buffer[1024];    // une variable locale automatique
    }
    Tous les segments on une taille limité et dans ton cas, avec ta variable locale surdimensionnée, tu as atteind la limite maximale du segment de la pile
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/04/2012, 11h27
  2. Allocation de mémoire statique
    Par cmarcx dans le forum Delphi
    Réponses: 12
    Dernier message: 04/08/2007, 13h29
  3. Réponses: 2
    Dernier message: 18/03/2007, 18h10
  4. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

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