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 :

Création objet dans boucle While


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut Création objet dans boucle While
    Bonjour tout le monde,

    j'ai une méthode qui à l'air de fonctionner mais je voulais savoir si s'était "propre" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while (w_address < 3840) 
    {					
      CMessTransfertDonnees *po_transDonnees = nullptr;		
      po_transDonnees = new CMessTransfertDonnees(pby_address,e_type_trt,e_type_zone,by_num_zone,b_synchro,64,w_address);	
     
      w_address = w_address + 64;
     
      if (po_transDonnees != NULL)
      {
        h_handle->Emettre(po_transDonnees,pby_address,dw_numSynchro);
      }
    }
    Donc en fait je créé à chaque fois l'objet po_transDonnees avec des paramètres différents (c'est "w_address" qui change).

    Voilà donc est-ce que ça peut le faire ?

    Merci pour vos réponses

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Tu connais le coup de la fuite mémoire?

    A moins que ta méthode "Emettre" ne prenne en charge la destruction de l'objet. Dans ce cas sache que ce n'est pas un C++ très moderne (mais peut-être tu n'as pas le choix? )

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Oui désolé de ne pas avoir préciser la chose je fait bien un delete de mon objet, mais c'est plus compliqué que ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void LIBCOMHSL_API DeleteCReseau(hCReseauHandle h_handle)
    	{
    		delete h_handle;
    	}
    ce sont des procédures contenues dans une DLL que j'appelle d'un autre programme (en Delphi) et qui se charge à chaque fois de supprimer l'objet fait avec l'instance "h_handle".

    Mais sinn pour revenir à la méthode du coup ça passe ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    La question c'est est-ce que tu delete ton CMessTransfertDonnees * ?

  5. #5
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Bonne question, explicitement non, sauf que si je fais "delete po_transDonnees" directement à la fin il me sort une erreur :

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Pour ma part, je ne trouve pas ça très propre:

    1. d'abord une boucle while avec incrémentation régulière, pour moi ça appelle un for, c'est plus lisible
    2. le ptr = nullptr; ptr = new ... mieux vaut écrire directement: ptr = new etc.
    3. s'il n'y a plus de mémoire une exception sera levée, donc tu n'iras pas plus loin, ce n'est pas plus de mémoire = pointeur NULL comme en C
    4. po_transfert_donnees est détruit en ligne 13 donc tu perds l'adresse renvoyée par new, sans avoir libéré la mémoire correspondante (à moins que tu l'aies fait dans Emettre, mais ce ne serait pas du tout une bonne pratique parce que le nom "Emettre" ne suggère pas que tu vas gérer de la mémoire).

    Mon conseil:
    1. si po_transfert_donnees est effectivement envoyé et pas stocké par émettre, il n'a pas besoin de vivre au delà de l'itération de la boucle, donc crée le sur la pile et passe le par référence à Emettre si tu peux en changer la signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for ( ; w_adress += 64; w_address < 3840) 
    {
        h_handle->Emettre(CMessTransfertDonnees(pby_address,e_type_trt,e_type_zone,by_num_zone,b_synchro,64,w_address),pby_address,dw_numSynchro);
    }
    Si tu ne peux pas transformer la signature, tu peux créer l'objet sur la pile puis passer son adresse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMessTransfertDonnees po_transfert_donnees(pby_address,e_type_trt,e_type_zone,by_num_zone,b_synchro,64,w_address);
    h_handle->Emettre(&po_transfert_donnees,pby_address,dw_numSynchro);
    2. si pour une raison ou une autre Emettre doit stocker la valeur, dis-le nous, les options sont nombreuses et dépendent entre autres du standard que tu respectes: 98, 11, 14?

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    merci pour vos conseils, en fait Emettre contient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    OVERRIDE void CReseau::Emettre( IN CMessage *po_message,
    							    IN const BYTE *pby_sop_address, 
    							    IN DWORD dw_num_synchro)
    {
    	CMsgReseauEmettre *po_mess = new (__FILE__, __LINE__)  CMsgReseauEmettre( po_message, pby_sop_address, dw_num_synchro);
     
    	if (po_mess != NULL)
    	{
    		m_poDeApplication->Write( po_mess);
    	}
    }
    et "CMsgReseauEmettre" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class CMsgReseauEmettre : public CComMsgReseau
    {
    	// Constructor(s)/Destructor
    public:	
    	CMsgReseauEmettre( IN CMessage *po_message, 
    						 IN const BYTE *pby_address,
    						 IN DWORD dw_num_synchro) : CComMsgReseau(pby_address),
    													m_poMessage(po_message) ,
    													dw_NumSynchro(dw_num_synchro)
    													{};
    	virtual ~CMsgReseauEmettre(void) {};
    	// Methods
    a été créé avec le principe du Design pattern "Visitor" ou "Visiteur" quoi. Alors je n'y connais pas grand chose donc si je ne sais pas si "po_message" est bien libéré :s

  8. #8
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Non, il n'est libéré nulle part dans le code que tu nous montres.
    Je te plains d'avoir à travailler avec du code comme ça, un mélange de C et de C++ objet spaghetti.
    La convention d'appel OVERRIDE, tu sais ce que c'est?

  9. #9
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Oui je n'ai pas eu le choix avec Delphi malheureusement, yep override :

    en fait dans le header il y a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual void Emettre(IN CMessage *po_message, IN const BYTE *pby_sop_address, DWORD dw_num_synchro) = 0;
    alors je vois pas pourquoi dans le cpp il met OVERRIDE déjà ...

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Ah si c'est Delphi...
    Je crois que l'intégration Delphi/C++ a ses particularités, je ne les connais pas du tout. Il y a un forum Delphi sur developpez.net, peut-être que tu feras meilleure pêche.

  11. #11
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    C'est loin d'être évident en effet, en tout cas merci pour les conseils

Discussions similaires

  1. Problème de bouton stop dans boucle while
    Par Simon et ulrich dans le forum LabVIEW
    Réponses: 4
    Dernier message: 04/08/2011, 10h59
  2. [ODBC] ODBC Access+ requete insert dans boucle while
    Par gpaca dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 17/03/2010, 16h41
  3. Action "onclick" dans boucle "while"
    Par ZeeBee dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2009, 22h29
  4. Réponses: 3
    Dernier message: 17/08/2007, 13h47
  5. Requete SQL dans boucle while
    Par vince_grenoblois dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 04/08/2006, 20h41

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