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 :

ERROR : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse =(


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut ERROR : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse =(
    Bonjour à tous,

    Lorsque je run mon programme, voici les erreurs qui me sont retourné :
    <gras>
    File:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
    Expression : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

    File:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
    _CrtIsValidHeapPointer(pUserData</gras>)

    J'ai chercher sur internet, c'est un problème de débordement de mémoire, ou autre, mais je ne vois pas d'erreur dans mon programme.
    En supprimant les lignes dans mon main, j'ai pu remarqué que je n'avais pas d'erreur si je supprimais la ligne ci-dessous(marqué en commentaire).
    J'ai donc cru que le problème venait du Constructeur/destructeur de Contenu. Sauf que je l'ai tester la classe dans le main, et je n'avais pas de problème.
    L'erreur ne pouvait donc venir que de la fonction creerSession, j'ai alors mit en commentaire la boucle for dans creerSession pour voir si le problème était la fct amie operator<< , mais le problème persistait.
    Il ne reste donc plus que ses lignes ci :

    Contenu contenu(aud,pre,obj,out,pl);
    lContenu.insert(lContenu.end(),contenu);

    Et je vois vraiment pas d'erreur.




    MAIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
     
        Organsime organsime("adresse","nom",630,420,"email");
        Formation formation;
        organsime.affichage();
        formation.creerSession(18,11,1988,"rue de la station");
        Theme theme("Theme");
        theme.afficherTheme();
    	formation.creerContenu("audience","prerequis","objectifs","outils","plan");
     
        return 0;
    }
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Ma classe contenu : 
     
    #ifndef CONTENU_H_INCLUDED
    #define CONTENU_H_INCLUDED
    #include "String.h"
    #include <iostream>
     
    using namespace std;
     
    class Contenu
    {
        private :
               char* audience;
               char* prerequis;
               char* objectifs;
               char* outils;
               char* plan;
        public :
     
        Contenu(const char*,const char*,const char*,const char*,const char*);
        void affichage();
        char* getAudience()const ;
        char* getPrerequis()const ;
        char* getObjectif()const;
        char* getOutil()const;
        char* getPlan()const;
     
        inline ~Contenu()
        {
            delete[] this->audience ;
            delete[] this->prerequis;
            delete[] this->objectifs ;
            delete[] this->outils ;
            delete[] this->plan ;
        }
     
     
    };
     
    #endif // CONTENU_H_INCLUDED
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include "Contenu.h"
     
    Contenu::Contenu(const char * aud,const char * pre,const char * obj,const char * out,const char * pl)
    {
     
    	this->audience=new char[strlen(aud)+1];
    	strcpy(this->audience,aud);
        this->prerequis=new char[strlen(pre)+1];
        strcpy(this->prerequis,pre);
        this->objectifs=new char[strlen(obj)+1];
        strcpy(this->objectifs,obj);
        this->outils=new char[strlen(out)+1];
        strcpy(this->outils,out);
        this->plan=new char[strlen(pl)+1];
        strcpy(this->plan,pl);
    }
     
    char* Contenu::getAudience() const
    {
        return this->audience;
    }
    char* Contenu::getObjectif() const
    {
        return this->objectifs;
    }
    char* Contenu::getOutil() const
    {
        return this->outils;
    }
    char* Contenu::getPlan()const
    {
        return this->plan;
    }
    char* Contenu::getPrerequis()const
    {
        return this->prerequis;
    }
     
    void Contenu::affichage()
    {
        cout<< this->audience<<"  "<<this->objectifs<<"  "<<this->outils<<"  "<<this->plan  <<"  "<<this->prerequis<<endl;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Formation : public ElementCatalogue
    {
        private :
     
                list<Contenu> lContenu;
                list<Contenu>::iterator itContenu;
     
        public :
     
     
                void creerContenu(const char *,const char *,const char *,const char *,const char *)
                inline Formation(){}
                friend ostream &operator<<(ostream &,const Session &);
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Formation::creerContenu(const char * aud ,const char * pre,const char * obj,const char * out,const char * pl )
    {
        Contenu contenu(aud,pre,obj,out,pl);
        lContenu.insert(lContenu.end(),contenu);
     
        for (itContenu = lContenu.begin(); itContenu != lContenu.end() ; itContenu++)
        {
            cout << *itContenu ;
        }
     
    }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    Par défaut
    Ta classe "Contenu" a un constructeur pas vraiment trivial (avec des pointeurs, tout ça).


    En utilisant les fonctions de la librairie standard, sans t'en rendre compte, tu réalises des copies et des assignations.

    Or le compilateur génère un constructeur par copie et un opérateur par défaut qui font une copie "stupide" (ils recopient le contenu de ta classe bits à bits).
    Du coup les manipulations de pointeurs évoquées plus haut vont mener à n'importe quoi (supprimer du contenu déjà supprimé, deux copies de classes contenant un pointeur vers la même chose...)


    Donc : tu dois écrire toi-même le constructeur par copie et l'opérateur d'assignation de "Contenu" si tu veux être sûr de ne pas avoir de problèmes.





    Note quand même que ta classe me semble un peu bizarre : en trimbalant des pointeurs partout dans un C way of life tu te fatigues pour rien, le C++ permet des choses beaucoup plus subtiles qui t'épargneraient énormément de soucis.
    Sans parler des inlines incongrus qui te feront sans doute pas gagner grand-chose...D'une manière générale, faire une course d'intelligence avec le compilateur n'est pas la première des choses à faire.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci, je vais donc faire le constructeur par recopie .
    Pour ce qui est des pointeurs , c'est la signature donnée par la prof, elle nous demande de faire comme ca, pour apprendre à maitriser les char , les adresse ..


    EDIT : Ici,A quel moment le constructeur par recopie par default est appelé?

  4. #4
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par Diostrofobe Voir le message
    EDIT : Ici,A quel moment le constructeur par recopie par default est appelé?
    Quand tu insères un contenu dans la liste lContenu.

    Citation Envoyé par Diostrofobe Voir le message
    Pour ce qui est des pointeurs , c'est la signature donnée par la prof,...
    La signature peut-être, mais ne peux tu pas utiliser des std::string pour les attributs des classes ? Sinon, il faut effectivement écrire un constructeur de copie.

    Citation Envoyé par ElGat0
    Or le compilateur génère un constructeur par copie et un opérateur par défaut qui font une copie "stupide" (ils recopient le contenu de ta classe bits à bits).
    Je dirais plutôt champ à champ.

Discussions similaires

  1. ERROR: pg_atoi: zero-length string
    Par steelspirit92 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h29
  2. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46
  3. [Kylix] Kylix c++ error
    Par pacpac dans le forum EDI
    Réponses: 2
    Dernier message: 10/06/2003, 16h27
  4. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 15h44
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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