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 de libération de ressource


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut Problème de libération de ressource
    Bonjour,

    Je code actuellement un programme sous Borland C++ Builder6.

    lors d'une vérification de fichier je dois faire un bilan afin de faire savoir à l'utilisateur que certain de ces fichiers ne sont pas valide.

    Or lorsque j'appelle souvent ma fenêtre de bilan je fini par avoir une exception "Ouf of ressource"
    je ne comprend pas pourquoi car je créée ma fenêtre puis la détruis après.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if ( bilan)
    {
            TForm_DeclanchementPAsGerer * p_fen1 = new  TForm_DeclanchementPAsGerer(this);
     
            isInPause = true;
            p_fen1->ShowModal();
            isInPause= false;
     
            delete p_fen1;
    }
    p_fen1 = NULL


    lorsque je n'affiche pas de bilan je n'ai pas de soucis.
    Ce "out of resource" n'est pas régulié. Autant au bout de 1 affichage j'ai le message d'erreur et autant une autre fois après 10 affichage toujours rien.

    Merci d'avance pour votre aide .

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Bonjour

    Je vois 3 sources potentielles :
    * la création d'une instance de TForm_DeclanchementPAsGerer alloue d'autres ressources, qui ne sont pas correctement libéré. Faut voir le code de cette classe
    * es tu sur que la source du problème soit bien à cette endroit ?
    * le programme quitte ta fonction entre le new et le delete... mais tu le saurais je suppose si tu avais une exception lancée

    En tout cas, je t'encourage à utiliser les pointeurs intelligents (unique_ptr ici)

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    tout d'abord Merci d'avoir pris le temps de me répondre.

    Je viens de revérifier afin d'être sûr de chez sûr, il n'y a aucune ressource qui pourrait ne pas être libérer lors du delete de ma classe. Cette fenêtre contient uniquement du texte, un bouton OK pour fermer la fenêtre, et un TMemo ou je stock également du texte.

    En faisant du pas à pas j'ai pu observer que mon code passe bien par le delete.

    Je ne suis pas tout a fait sûr que le problème vienne de là mais j'ai constaté que lorsque je n'affichais pas de bilan je n'observais pas ce message de OutOfRessource.

    Ce problème n'étant pas répétable a un instant donnée, j'ai du mal a savoir en pas à pas quand celui ci va se produire et par la même observé a quelle moment exacte surgit le problème.

    EDIT : Je viens par hasard de tomber sur le moment exact où le problème se produit. Le message m’apparaît au moment de l'instanciation de la fenêtre.

    EDIT2 : Je viens également de tester l'implémentation avec des std::unique_ptr mais malgrès le fait que j'ai fait l'include <memory> le compilateur me dis qu'il ne connais pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm_DeclanchementPAsGerer * p_fen1 = new  TForm_DeclanchementPAsGerer(this);

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Je trouve ton code pour le moins étrange.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ( bilan)
    {
            TForm_DeclanchementPAsGerer * p_fen1 = new  TForm_DeclanchementPAsGerer(this);
     
            isInPause = true;
            p_fen1->ShowModal();
            isInPause= false;
     
            delete p_fen1;
    }
    p_fen1 = NULL
    Bon, passons sur le ; oublié à la fin, mais... ça compile ça ?!
    p_fen1 n'est pas sensé être connu en sorti du bloc puisque sa portée est limité à ce bloc.
    Pourquoi utiliser une allocation dynamique ?
    p_fen1 ne serait-il pas déclaré également ailleurs ? Aucun warning, aucune erreur ?
    A quoi servent les flag de pause ? Une fenêtre modal a de toutes façons la priorité jusqu'à sa fermeture. S'agit-il d'un contexte multi-thread ? Des allocations sont faîtes dans ces autres threads ?

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    il s'agit d'une erreur de recopi.

    J'ai enlevé des lignes n'ayant pas de rapport avec mes fenêtres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ( bilan)
    {
            TForm_DeclanchementPAsGerer * p_fen1 = new  TForm_DeclanchementPAsGerer(this);
     
            isInPause = true;
            p_fen1->ShowModal();
            isInPause= false;
     
            delete p_fen1;
    p_fen1 = NULL;
    }

    Voici le code propre.

    il s'agit bien d'une application multithread. les flags de pause me permette de synchroniser avec un autre thread.

    Cette fenêtre n'est utilisé/instantié que dans cette fonction.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    @Bousk
    Bien vu...

    J'ai enlevé des lignes n'ayant pas de rapport avec mes fenêtres.
    Ca commence à faire beaucoup de chose que l'on voit pas, sans être sur que la source du problème ne vient pas de là


    Concernant unique_ptr, comme tu n'as pas un compilateur à jour, il faut utiliser boost

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    voici la partie du code manquante :
    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
    if ( typeTraj )
    {
        Bilan1.clear();
        stverification_fichier1 fichierEnCourDeVerif;
        //initialisation des variables de la verification du fichier
        fichierEnCourDeVerif.typeTrajInconnue =0;
        fichierEnCourDeVerif.sautDeLigne =0;
        fichierEnCourDeVerif.nomFichier =l_filename;
     
        VerificationFichierLWO(AnsiString(l_filename),&fichierEnCourDeVerif.typeTrajInconnue);
     
        if (fichierEnCourDeVerif.typeTrajInconnue !=0 || fichierEnCourDeVerif.sautDeLigne !=0)
            Bilan1.push_back(fichierEnCourDeVerif);
        if ( Bilan1.size()>0)
        {
            if ( bilan)
            {
                TForm_DeclanchementPAsGerer * p_fen1 = new TForm_DeclanchementPAsGerer(fenPopup);
                p_fen1->SetValue(Bilan1);
     
                isInPause = true;
                p_fen1->ShowModal();
                isInPause = false;
     
                delete p_fen1;
     
    	    if ( demandeEtape)
    	    {
    		m_etape = l_filename;
    	    }
                p_fen1 = NULL;
     
                valide = false;
            }// FIN if ( bilan)
     
     
        }// FIN if ( Bilan1.size()>0)
        avancement++;
    }//FIN  if ( typeTraj )


    Voici la fonction SetValue qui rempli ma form:
    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
    void TForm_DeclanchementPAsGerer::SetValue( vector <st_verification_fichier1> list)
    {
            Memo_detail->Lines->Clear();
            if (list.size() == 1)
            {
                    int posDebutFilename = list[0].nomFichier.LastDelimiter( "\\");
                    AnsiString  FilenameRaccourci = list[0].nomFichier.SubString(posDebutFilename+1, list[0].nomFichier.Length()-posDebutFilename);
     
                    Label_nom_dufichier_lwo->Caption = FilenameRaccourci;
            }
            else
                    Label_nom_dufichier_lwo->Caption = "";
     
            for (unsigned int indice =0; indice <list.size(); indice ++)
            {
                    if (list[indice].typeTrajInconnue!=0)
                    {
                            Memo_detail->Lines->Add(GetTraduction("Nom du fichier : ")+ list[indice].nomFichier);
                            Memo_detail->Lines->Add(" ");
                            Memo_detail->Lines->Add(GetTraduction("Nombre de déclanchement laser non gérés : ") );
     
     
                            Memo_detail->Lines->Add(GetTraduction("Inconnus : ")+(AnsiString)list[indice].typeTrajInconnue);
                            Memo_detail->Lines->Add("************************************");
                            Memo_detail->Lines->Add("");
                    }
            }
    }

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Sur l'aide de borland,

    il est dit que l'exception EOutOfResource est lancé lorsqu'une application tente de créer un handle Windows et qu'il n'y a pas plus la place en allouer plus.

    C'est ce qui m'a mis sur la piste de la désalocation de ma fenêtre qui se passe mal et qui ne libère pas le handle de la fenetre.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Comme plus haut
    - à quoi servent les flags de pause ?
    - pourquoi une allocation dynamique ?
    - multi-thread ?
    - allocations dans les autres threads ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void TForm_DeclanchementPAsGerer::SetValue( vector <st_verification_fichier1> list)
    Combien d'éléments dans list ? Quel est le type de ces éléments ?
    Pourquoi ne pas passer list en const reference et en faire une copie ?

  10. #10
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Dsl a priori mon message en réponse à tes questions n'a pas été envoyé:

    multi-thread ?
    oui il s'agit bien d'une application multithread

    à quoi servent les flags de pause ?
    le flag pause me permet d'indiquer à un autre thread que j'ai ouvert une fenêtre et que celui ci doit empêcher l'utilisateur de cliquer sur un bouton.

    pourquoi une allocation dynamique ?
    Pour ma TForm ? le compilateur Borland refuse que je créer des Fenetre en statique :
    [C++ Error] ThreadVerificationFichier.cpp(542): E2459 VCL style classes must be constructed using operator new


    - allocations dans les autres threads ?
    Ma fenetre n'est instancié/utilisé qu'ici.

    Combien d'éléments dans list ? Quel est le type de ces éléments ?
    le nombre d'élément de la list est variable en fonction du nombre de fichier invalide. il s'agit d'une structure composé de type simple ( int , unsigned int, bool ) et d'AnsiString

    Pourquoi ne pas passer list en const reference et en faire une copie ?
    je devrai en effet mettre le mot clé const ( j'y vais de ce pas). pour ce qui est de la copie, il me semblais que lorsque je passe directement un objet sans utilisé de pointeur ou de référence cela créé automatiquement un copie de mon objet.

    Désolé pour mon ignorance, je suis encore débutante dans la manière.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par flamme34 Voir le message
    le flag pause me permet d'indiquer à un autre thread que j'ai ouvert une fenêtre et que celui ci doit empêcher l'utilisateur de cliquer sur un bouton.
    Normalement le fonctionnement d'une fenêtre en modal est d'empêcher toute interaction avec autre chose qu'elle-même. Donc.. quid ?

    Citation Envoyé par flamme34 Voir le message
    Ma fenetre n'est instancié/utilisé qu'ici.
    Cette fenêtre n'est peut-être (surement) pas la réelle source de l'erreur.

    Citation Envoyé par flamme34 Voir le message
    le nombre d'élément de la list est variable en fonction du nombre de fichier invalide. il s'agit d'une structure composé de type simple ( int , unsigned int, bool ) et d'AnsiString

    je devrai en effet mettre le mot clé const ( j'y vais de ce pas). pour ce qui est de la copie, il me semblais que lorsque je passe directement un objet sans utilisé de pointeur ou de référence cela créé automatiquement un copie de mon objet.
    Plus que la constance c'est la référence qui importe. Oui par défaut les paramètres sont passés par copie, et c'est bien là le problème : si la liste contient beaucoup d'éléments lourds en mémoire, ça fait une copie inutile de ces éléments et autant de source d'erreur potentielle et prend de la place pour rien (et à priori t'en manques).

  12. #12
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Normalement le fonctionnement d'une fenêtre en modal est d'empêcher toute interaction avec autre chose qu'elle-même. Donc.. quid ?
    Pour faire simple, il s'agit d'une fenêtre de progression qui permet de voir l'avancement de la vérification des fichiers. Celle ci est dans le thread principal.
    Dans cette fenêtre il y a un bouton annuler que je veut grisé quand une fenêtre d'erreur ( dans le thread secondaire) apparaît ( donc ici en showmodal).

  13. #13
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Je viens de rajouter le passage par référence de l'objet list dans ma fonction.

    Malgrès toute ces préventions j'obtient quand même l'erreur EOutOfResources.

Discussions similaires

  1. Problème de libération des ressources
    Par willythe88 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/07/2011, 11h17
  2. Réponses: 4
    Dernier message: 20/04/2007, 15h19
  3. Réponses: 13
    Dernier message: 03/04/2006, 10h01
  4. Problèmes de libération de Dll en delphi7 sous windows XP
    Par Tardiff Jean-François dans le forum Langage
    Réponses: 5
    Dernier message: 10/01/2006, 15h30
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

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