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 :

[Exceptions] lancement d'exception : std::bad_alloc


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    Par d�faut [Exceptions] lancement d'exception : std::bad_alloc
    bonsoir tout le monde !
    svp quelqu un pour m'expliquer pourquoi � la compilation le compilateur lance cette exception :
    throwing an instance of 'std::bad_alloc'
    what(): std::bad_alloc
    j'ai compri que peut etre l'erreur �t� dans l'allocation de memoire j ai essayer quelque modification mais j'ai besoin d'explication d'un expert SVP .
    voici le code :
    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
    #include <windows.h>
    class texte{
        int taille;
        char *t;
    public :
        texte(void);         // constructeur par defaut
        texte(const texte  & source);   // constructeur de copie
        ~texte(void);      // destructeur
    };
     
    texte::texte(void){ }
     
    texte::texte(const texte &source){
        int taille = source.taille;
            t = new char  [taille + 1];
            strcpy(t, source.t);
    }
     
    texte::~texte(void) {delete t;}
     
    int main(void){
        texte t1;
        texte t2(t1) ;
        return 0;
    }

  2. #2
    Membre exp�riment�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 190
    Par d�faut
    Salut,

    Ton constructeur par d�faut n'initialise aucune donn�e membre. Donc taille vaut n'importe quoi. Quand tu copies t1 et que tu fais new char[taille+1] la valeur de taille+1 peut �tre �norme ce qui explique le lancement de l'exception.

    Une autre remarque: dans le destructeur c'est delete[] qu'il faut utiliser et pas delete.

    Sinon comme tu fais du C++ (et non du C) tu devrais utiliser std::string �a t'�viterait de faire ce genre d'erreur.

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    c'est parce que tu ne d�finis pas la taille dans le constructeur par d�faut...

    Le r�sultat, c'est que la valeur du membre taille de l'instance t1 est... strictement n'importe quoi (les "crasses" d'une utilisation ult�rieure de la m�moire)...

    Cela signifie que ce peut tout aussi bien �tre �gal � 0x00003 qu'� 0xFF58AB (voire � 0xFFFFFFFF)

    Quoi qu'il en soit, la valeur de taille est sup�rieure � l'espace m�moire contigu qu'il est possible de trouver sur le syst�me, ce qui fait que l'allocation de la m�moire �choue, et que new renvoie l'exception bad_alloc

    [Edit] nous ne le r�p�terons jamais assez, lorsqu'il s'agit de g�rer des chaines de caract�res, le mieux reste toujours d'utiliser la classe string, fournie d'office par le standard, et disponible dans l'espace de noms std par inclusion du fichier d'en-t�te <string>
    [EDIT 2]grilled
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    Par d�faut
    Merci � tous pour l'aide que vous avez donner .
    en effet je devais definir le constructeur . parce que la regle dit : s'il faut definir un constructeur de copie ,il faut definir avec l'operateur d'affectaion et le constructeur ,
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    texte::texte(){
        taille=0;
        return ;
     }

  5. #5
    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
    Par d�faut
    Bonjour,
    Dans l'ordre:
    1/ Tu dois aussi initialiser ton pointeur (t=NULL)
    2/ Le return ne sert � rien.
    3/ Tu devrais utiliser std::string comme mentionn� pr�c�demment.

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Attends, j'ai du mal � comprendre ce thread.
    C'est lors de la compilation que le compilateur lui-m�me lance une exception et se termine sur une erreur, ou bien c'est � l'ex�cution de ton programme que ton programme lance une exception et se termine en erreur ?
    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.

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    106
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 106
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    Attends, j'ai du mal � comprendre ce thread.
    C'est lors de la compilation que le compilateur lui-m�me lance une exception et se termine sur une erreur, ou bien c'est � l'ex�cution de ton programme que ton programme lance une exception et se termine en erreur ?
    c'etait a l'ex�cution du programme

Discussions similaires

  1. Besoin d'aide avec Exception std::bad_alloc
    Par YohDono dans le forum C++
    R�ponses: 2
    Dernier message: 18/05/2013, 18h40
  2. R�ponses: 0
    Dernier message: 26/07/2010, 19h26
  3. Attente avant lancement d'exception
    Par albedo0 dans le forum Langage
    R�ponses: 3
    Dernier message: 19/01/2010, 20h42
  4. Exception + lancement de commande shell
    Par remsrock dans le forum C#
    R�ponses: 15
    Dernier message: 01/07/2008, 18h26
  5. std::bad_alloc Exception projet VCL
    Par mickyoun dans le forum C++Builder
    R�ponses: 4
    Dernier message: 15/10/2007, 17h48

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