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++Builder Discussion :

Codeguard erreur sur destructeur


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par d�faut Codeguard erreur sur destructeur
    Bonjour,

    je passe codeguard sur mon appli et j'ai une erreur que j'ai du mal � comprendre.
    Mon appli est constitu�e d'une dll et d'un exe.
    Ma dll exporte la fonction suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    vector<TEventData> __stdcall mLgetFaults()
    TEventData est une classe � moi.
    La partie exe r�cup�re le vector, tout se passe bien � l�ex�cution, mais si je compile avec codeguard, il me signale une erreur sur le destructeur de TEventData (qui ne fait rien vu que cette classe ne contient que de types simples) :
    Bad parameter in process: MonAppli.exe(6480) - c:\program files\embarcadero\rad studio\8.0\include\dinkumware\xmemory#129
    A bad object (0x34F79E0) has been passed to the function.
    0x006909BC Call to delete(0x03507A80)
    ...................
    0x0040B38B - src\GenericData\EventData.h#45
    .............................
    � cette ligne j'ai le code suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    	~TEventData()
    	{
    	};
    Il passe donc 2 fois dans le destructeur ce qui me parait normal en fait (une fois pour la cr�ation des TEventData dans l'exe, une fois pour la cr�ation dans la dll), mais �a ne doit pas �tre le cas puisque codeguard me sort une erreur...
    J'avoue que je ne comprends pas trop...

    merci d'avance pour vos suggestions d'explication
    Pascale38

  2. #2
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    En C++Builder 2007, mon CodeGuard me fait souvent des VA � la fermeture du projet, je crois que c'est au moment du d�chargement des Packages

    Cela a �t� am�lior� en XE2

    Sinon attention, ne partage pas d'objet entre EXE et DLL, �vite de cr�er d'un c�t� et lib�rer de l'autre c�t� !

    Tu n'�change tout de m�me pas un vector directement ?
    Ta DLL ne pourra �tre utilis� qu'avec uniquement la version de ton compilateur (un vector de C++Builder6 n'aura peut-�tre pas la m�me gueule m�moire que celui de C++BuilderXE2, et je ne parle m�me pas des autres compilateurs C++)

    En plus, �a ne fait pas des copies dans tous les sens �a ?
    Tu devrais plut�t faire une fonction respectant les conventions WinAPI

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    BOOL __stdcall mLgetFaults(TEventData* Buf, int& BufCount);
    Buf est allou� du c�t� appelant, il indique le nombre d'�lement possible par BufCount (en nombre d'item) ou un BufSize en octet

    cela renvoi un code d'erreur pour signaler un Buf trop petit
    Typiquement, si tu fournis Buf NULL, la fonction calcule BufCount, permettant d'allouer la m�moire !
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    ce point est document� sur MSN
    voici le lien
    http://support.microsoft.com/kb/172396/fr
    cdlt
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par d�faut
    Salut ShaiLeTroll,

    bon j'avais pas envie de m'emb�ter avec des pointeurs, je sais �a fait des copies, mais bon mon vector fait 24 max donc c'est pas �norme non plus.
    Mais bon merci pour l'info, je ne savais pas que c'�tait incompatible entre version de compilo !!
    Sinon j'utilise XE, alors comment savoir si c'est un probl�me codeguard ou non ?

    Utiliser
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    BOOL __stdcall mLgetFaults(TEventData* Buf, int& BufCount);
    j'avoue que je trouve �a super lourd !! Allouer un Buf sans savoir sa taille avec une valeur au hasard... beurk
    Bon ceci dit j'ai test�, j'alloue mon buf � 24 dans l'appelant (vu que l� j'ai la chance de savoir que c'est le max), je fais le delete dans l'appelant et j'obtiens exactement la m�me erreur codeguard... sur le delete et sur le destructeur de TEventData...

    Donc DjmSoftware, merci pour ton lien, mais il semblerait qu'il n'y ait aucun rapport avec le fait que j'utilise un conteneur de la STL.

    Pascale38

  5. #5
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Citation Envoy� par Pascale38 Voir le message
    j'avoue que je trouve �a super lourd !! Allouer un Buf sans savoir sa taille avec une valeur au hasard... beurk
    C'est pas faux, d'o� DEUX Appels comme je l'avais expliqu� dans ma r�ponse !
    Un Appel mLgetFaults(NULL, var);il rempli var avec ce qu'il faut allouer puis mLgetFaults(buf, var);Typique des API Windows !

    Tu peux aussi faire une liste chain�e avec une fonction mLgetFaultsFirst(Buf) et mLgetFaultsNext(CurBuf, NextBuf)Fonctionnement du TreeView je crois !

    Je pr�f�re utiliser des interfaces, ainsi, la m�moire est allou� c�t� DLL, tu peux avoir une propri�t�s Count\Items, facile � utiliser, puis une m�thode pour nettoyer !
    Ainsi ma DLL n'a que deux trois Exports, dont l'un est une Factory, ensuite tout le reste c'est POO � fond !

    J'utilise aussi bien des Interface C++ (class abstraitre pure) que des DelphiInterface (TInterfacedObject, GUID et Supports ...)
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par d�faut
    Not possible pour 2 appels :
    En fait le "tableau" est construit dynamiquement � chaque appel, entre 2 appels il peut tr�s bien contenir +ou- d'�l�ments...

    Les autres solutions, surement tr�s bien, toujours un peu lourdes � mon go�t...
    Tout �a pour �changer un tableau...

    Ceci dit mon probl�me de base avec codeguard reste le m�me :
    c'est donc codeguard qui bug ???

    merci en tout cas pour toutes tes pistes !!!
    Pascale38

  7. #7
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Ce n'est pas vraiment CodeGuard qui bug mais qui ne comprend pas que l'on lib�re un objet allou� dans l'espace m�moire d'un processus A dans un module B
    Cela vient plutot de Windows et la gestion m�moire entre EXE et DLL

    C'est pour cela qu'il existait ShareMem en Delphi
    La RTL dynamique doit �tre aussi un aspect de cela !

    Tant que ta DLL reste une utilisation interne et non utilisable par des logiciels tiers, tu peux te permettre ta m�thode

    Je te conseille de suivre la m�thode de l'article de DjmSoftware !
    Un petit pointeur �a ne fait pas de mal !

    ton code actuel
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vector<TEventData> __stdcall mLgetFaults();
    remplace le par
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    typedef vector<TEventData> TEventDataVector;
    typedef TEventDataVector* PEventDataVector;
     
    PEventDataVector __stdcall mLgetFaults();
    void__stdcall mLFreeFaults(PEventDataVector Vector);
    Ainsi, tu �changes un pointeur cr�� par la DLL
    Il faudra juste lib�r� manuellement !
    CodeGuard sera content de voir que Allocation et Lib�ration sont effectu� du m�me c�t� !

    Je ne fais du C++ que depuis un an, en Delphi les habitudes ne sont pas les m�mes mais pour ton cas un code fa�on RAII serait id�al

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct TEventDataReader
    {
      PEventDataVector Items;
     
      TEventDataReader()
      {
         Items = mLgetFaults();
      }
     
      ~TEventDataReader()
      {
        mLFreeFaults(Items);
      }
    }
    Dans ton juste en d�clarant un TEventDataReader cela app�le la DLL, et en le lib�re implicitement


    Tu peux aussi diff�r� la lecture, si tu ne veux pas que d�s que l'instanciation se produit cela appelle la DLL, par exemple si tu veux en faire un membre de classe

    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
    struct TEventDataReader
    {
      PEventDataVector Items;
     
      TEventDataReader() : Items(NULL) {};
     
      int ReadItems();
      {
         Items = mLgetFaults();
         return Items->size(): 
      }
     
      ~TEventDataReader()
      {
        if (Items)
          mLFreeFaults(Items);
      }
    }
    le code d'appel �tant tr�s simple

    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
    void MaFonction()
    {
      ...
     
      TEventDataReader Reader; 
      if (Reader.ReadItems() > 0)
      {
        for (TEventDataVector::iterator it = Reader.Items->begin(); it != Reader.Items->end(); ++it)
        {
          *it ... 
        }
      }
     
      // libération automatique à la fin du bloc
    }
    le typedef simplifie l'utilisation du type vector, cela donne un code plus rigoureux !
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Erreur sur une fonction avec des param�tres
    Par Elois dans le forum PostgreSQL
    R�ponses: 2
    Dernier message: 05/05/2004, 21h00
  2. [VBS] Erreur sur "AddWindowsPrinterConnection"
    Par Admin dans le forum VBScript
    R�ponses: 5
    Dernier message: 27/03/2004, 16h15
  3. Erreur sur serveur li�
    Par k-lendos dans le forum MS SQL Server
    R�ponses: 2
    Dernier message: 18/03/2004, 15h21
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et ant�rieur
    R�ponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Erreur sur le TNSListener apr�s installation de 9iAS
    Par Patmane dans le forum Installation
    R�ponses: 4
    Dernier message: 04/02/2004, 11h16

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