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 :

Stack overflow incompréhensible : déclaration int


Sujet :

C++

  1. #1
    Membre confirmé Avatar de athlon64
    Profil pro
    Inscrit en
    Février 2009
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 243
    Points : 547
    Points
    547
    Par défaut Stack overflow incompréhensible : déclaration int
    Bonjour,

    j'ai un petit code de C++ pour tester le temps d'un algo de tri.
    je suis sous visual studio 2013.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int _tmain(int argc, _TCHAR* argv[])
    {
    	const int NBtab =1000000;  //erreur  à l’exécution 
    
    	srand(static_cast <unsigned int> (time(NULL)));//initialisation du generateur de nombre aleatoire
    
    	
    	int tab[NBtab];
    ...
    C'est un bug ou quoi ? On ne peut stoker 1 million dans un int qui culmine à INT_MAX= 2147483647 ?




    Après un petit test, sans erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int NBtab =100000;  //100 mille
    const int NBtab2 = 10000000;  //10 millions 
    int tab[NBtab];
    je viens de voir que c'est le tableau[1 million] qui déclenchait l'erreur car trop gros pour tenir dans la pile, et pourtant c'est la déclaration de NBtab qui lève l’exception, un défaut du debugger visual ?
    ou c'est normal, quelqu’un peut m'expliquer ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce n'est pas la déclaration du int qui cause l'exception, c'est l'entrée dans la fonction ou le bloc (selon le compilo).

    Les variables allouées sur la pile le sont toujours au minimum en début de bloc, et le plus souvent en début de fonction, même s'ils ne sont vraiment construits que plus tard (hormis les VLA, je suppose, mais il n'y en a pas en C++) .
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Sous GNU/Linux, tu peux voir la taille de la pile avec la commande ulimit -a.
    Chez moi, elle fait 8192 kbytes. (C'est une valeur relativement courante).

    Lorsque tu déclares ton tableau de int, si on suppose que sizeof(int) == 4 bytes, on a 1000000 * 4 = 4000000 = 4000 kbytes.

    Chez moi ça passe, mais ça fait une erreur de segmentation à un peu plus de 2000000.

  4. #4
    Membre confirmé Avatar de athlon64
    Profil pro
    Inscrit en
    Février 2009
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 243
    Points : 547
    Points
    547
    Par défaut
    ok, loin de moi de vouloir augmenter la taille de la pile, ce sont des solutions pas propres, je voulais surtout comprendre...


    En effet c'est l'entrée dans le bloc main, ci dessous la ligne pointée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       mainret = wmain(argc, argv, envp);
    du fichier, C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\crtexe.c

    Donc au début, toutes les variables non imbriquées dans des blocs sont alloués, si je me souviens bien d'un vieux cours... d'où la levée d’exception au début lors de l'allocation du tableau...

    ps: @Médinoc, quelle différence fais tu entre allouer et construire ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Allocation: La place est réservée sur la pile pour l'objet ou le tableau.
    Construction: Les constructeurs sont appelés.

    Le traitement d'exception C++ possède également un décalage entre destruction et dépilement. Dans cet exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void fonction()
    {
    	try
    	{
    		ClassToto obj1;
    		throw std::exception("test");
    	}
    	catch(std::exception const &ex)
    	{
    		ClassToto obj2;
    		std::cout << ex.what() << std::endl;
    	}
    }
    Ici, lors que l'exception est lancée, obj1 est détruit, mais n'est pas retiré de la pile. obj2 est empilé "par-dessus" son cadavre. Tout est dépilé une fois le traitement d'exception terminé.
    (javais fais ces tests sous Visual 2005)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé Avatar de athlon64
    Profil pro
    Inscrit en
    Février 2009
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 243
    Points : 547
    Points
    547
    Par défaut
    Il n'y donc pas de construction pour les types etc.

  7. #7
    Membre confirmé Avatar de athlon64
    Profil pro
    Inscrit en
    Février 2009
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 243
    Points : 547
    Points
    547
    Par défaut
    Citation Envoyé par Ehonn Voir le message

    Lorsque tu déclares ton tableau de int, si on suppose que sizeof(int) == 4 bytes, on a 1000000 * 4 = 4000000 = 4000 kbytes.

    Chez moi ça passe, mais ça fait une erreur de segmentation à un peu plus de 2000000.
    En passant c'était le tableau de int pas la variable int qui provoquait l’exception, et comme l'a dit @Médinoc on s'en aperçoit au tout début du block...

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

Discussions similaires

  1. [GNU-Prolog][Mémoire] Local stack overflow
    Par Maxoo dans le forum Prolog
    Réponses: 15
    Dernier message: 04/06/2008, 22h15
  2. stack overflow: question insoluble
    Par coyotte507 dans le forum SDL
    Réponses: 3
    Dernier message: 19/12/2006, 17h50
  3. Stack OverFlow
    Par Goundy dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2005, 21h35
  4. Problème de stack overflow
    Par heider dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2005, 19h50
  5. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16

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