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 dans ce code ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut Problème d'allocation dans ce code ?
    Bonjour,

    j'utilise une méthode pour remplir une map d'objets indexés par leurs noms.

    La déclaration de cette map est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<CString,monTypeObjet> maMap;
    Pour la remplir, je me sers d'une boucle, que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /*prototype*/
     
    monTypeObjet *ptrObjet = new monTypeObjet();
     
    /* Autres déclarations, blabla */
     
    /*boucle*/
    while(maCondition)
    {
      ptrObjet -> remplirObjet(unParametreQuiChangeAChaquePassageDansLaBoucle);
      maMap[nomObjet]=*(ptrObjet);
    }
     
    /* ...*/
    J'ai l'impression qu'il y a un problème d'allocation (j'en suis même sur, car j'obtiens des résultats faux) mais je ne vois pas trop comment le résoudre...

  2. #2
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Là je vois pas trop.
    Donnes nous le code de remplirObjet si possible et de monTypeObjet

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class monTypeObjet
    {
    private:
    BSTR unAttribut;
    int unAutreAttribut;
    /*etc.*/
     
    public:
    monTypeObjet();
    ~monTypeObjet();
     
    void remplirObjet(CString filePath);
    };
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void monTypeObjet::remplirObjet(CString filePath)
    {
    /*Ouverture d'un fichier, lecture dans ce fichier, et remplissage des attributs, du genre: */
     
    unAutreAttribut = unTrucLuDansLeFichier;
    /*etc.*/
    }
    Rien de sorcier, en somme...

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Deux choses:

    1/ Je déconseille de mélanger MFC et STL (CString c'est la MFC, std::map c'est la STL). la classe std::string remplace avantageusement la CString. (Bon parfois on n'a pas vraiment le choix, j'en conviens.)

    2/ La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maMap[nomObjet]=*(ptrObjet);
    utilise le constructeur par copie de monTypeObjet. Es-tu certain que ce constructeur par copie est correct?

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Les conteneurs standard fonctionnent avec des valeurs, qui en particulier doivent être convenablement copiables dans le sens usuel du terme.
    Ton type n'a pas l'air de se comporter comme une valeur à cause du membre BSTR, qui n'est qu'un pointeur à priori.

    Ensuite tu utilises des pointeurs et de l'allocation dynamique, ce qui semble complètement inutile ici.

  6. #6
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Si tu utilises ceci :
    Citation Envoyé par magicpm7 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<CString,monTypeObjet> maMap;
    Pour la remplir, je me sers d'une boucle, que voici :

    [CODE]/*prototype*/

    monTypeObjet *ptrObjet = new monTypeObjet();
    parceque tu penses ainsi réutiliser le même objet pour économiser des instanciations dans ta boucle --> dis toi bien que c'est une très mauvaise idée.

    Il vaut mieux au contraire limité la porté des variable à la boucle.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Médinoc est de retour de vacances, et pense que ROD et Loufoque ont mis le doigt sur le problème :
    monTypeObjet n'a pas de constructeur de copie ni d'opérateur d'affectation personalisés, donc la BSTR n'est pas gérée correctement (une bête copie de son pointeur alors qu'il n'y a pas de comptage de référence) --> Crash.

    Donc: Définir un constructeur de copie et un opérateur d'affectation corrects.
    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.

Discussions similaires

  1. Problème try-catch dans mon code
    Par little pepito dans le forum Langage
    Réponses: 7
    Dernier message: 11/06/2007, 12h22
  2. Réponses: 16
    Dernier message: 18/10/2006, 22h52
  3. Probléme de transparence dans le code.
    Par Rifton007 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/07/2006, 20h40
  4. Problème de paramètres dans mon code javascript
    Par cocacollection dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/03/2006, 10h53
  5. Problème avec Between dans un code
    Par Sendo dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 18h44

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