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

Langage C++ Discussion :

Delete un foncteur dans l'appel de celui-ci.


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut Delete un foncteur dans l'appel de celui-ci.
    Salut, je souhaiterais delete un foncteur dans l'appel de celui-ci même.

    Code cpp : 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
     
    void FileDialog::onFileSelected(Label* label) {
                    std::string fileName = label->getText();
                    sf::Color color = label->getForegroundColor();
                    for (unsigned int i = 0; i < pFiles.getChildren().size(); i++) {
                        getListener().removeCommand("f"+static_cast<Label*>(pFiles.getChildren()[i])->getText());
                    }
                    pFiles.removeAll();
                    if (color == sf::Color::Red) {
                        std::string currentDir = lTop.getText();
                        currentDir += "/"+fileName;
                        lTop.setText(currentDir);
                        if (DIR* current = opendir(fileName.c_str())) {
                            dirent *ent;
                            std::string fileNames;
                            unsigned int i = 0;
                            while ((ent = readdir(current)) != NULL) {
                                if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..")) {
                                    fileNames = std::string(ent->d_name);
                                    Label* lFile = new Label(rw, math::Vec3f(0, 0, 0), math::Vec3f(800, 600, 0), font, "");
                                    pFiles.addChild(lFile);
                                    lFile->setParent(&pFiles);
                                    lFile->setRelToParentLayout(math::Vec3f(0, 0.05 * i, 1, 0.05));
                                    lFile->setText(sf::String(fileNames));
                                    struct stat path_stat;
                                    stat(fileNames.c_str(), &path_stat);
                                    if(!S_ISREG(path_stat.st_mode))
                                        lFile->setForegroundColor(sf::Color::Red);
                                    i++;
                                }
                            }
                        }
                    }
                }

    onFileSelected est appelé via un foncteur que je delete. (je delete aussi l'argument du foncteur (Le label))

    Mais ça crash.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #0 0x4cfde9	odfaeg::core::FastDelegate<bool>::operator()<>() const(this=0x120d2c0) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/fastDelegate.h:552)
    #1 0x4cf334	odfaeg::core::Command::isTriggered(this=0x7ffff5adb7e0 <main_arena+128>) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/command.cpp:43)
    #2 0x4221c3	odfaeg::core::Listener::processEvents(this=0x10879b0) (/usr/local/include/odfaeg/Core/../Graphics/../Core/listener.h:122)
    #3 0x453a15	odfaeg::graphic::RenderComponentManager::updateComponents(this=0x87a730) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/renderComponentManager.cpp:99)
    #4 0x42069c	odfaeg::core::Application::render(this=0x7fffffffe290) (/usr/local/include/odfaeg/Core/application.h:127)
    #5 0x42011e	odfaeg::core::Application::exec(this=0x7fffffffe290) (/usr/local/include/odfaeg/Core/application.h:79)
    #6 0x41ffe9	main(argc=1, argv=0x7fffffffe4d8) (/home/laurent/Développement/Projets-c++/ODFAEGCREATOR/main.cpp:4)
    Alors je cherche une solution pour delete le foncteur à un autre endroit que dans le foncteur lui même.

    Quelqu'un à t'il une idée ?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon, j'ai trouvé une solution en "deletant" le foncteur plus tard (au tour de boucle suivant), car, apparemment, on ne peut pas delete un pointeur de fonction pendant son appel.

  3. #3
    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
    Je vois aucun delete dans ton code.
    Le suicide existe et est autorisé : delete this; est parfaitement légal et fonctionnel du moment que t'accèdes pas au this derrière bien entendu.
    on ne peut pas delete un pointeur de fonction pendant son appel.
    On ne peut pas delete de pointeur de fonction. Les fonctions existent dans l'exécutable et leur pointeur n'est pas vraiment allouée. Tu peux tout au plus delete un objet qui sert de handler vers ce pointeur.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 712
    Points
    7 712
    Par défaut
    En effet détruire un objet est en cours d'appel de fonction est pour le moins risqué.
    On ne peut le faire que si lors du retour du traitement en cours, plus aucun accès ne sera fait à l'objet. Cela est rarement garanti donc détruire un objet qui nous appelle est à proscrire sauf cas maîtrisé.

  5. #5
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Un autre solution est de marquer les objets à détruire, puis de les détruire après les traitements.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Un autre solution est de marquer les objets à détruire, puis de les détruire après les traitements.
    Oui c'est ce que j'ai fais ici :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for (unsigned int i = 0; i < pFiles.getChildren().size(); i++) {
                            if (static_cast<Label*>(pFiles.getChildren()[i])->getForegroundColor() == sf::Color::Red) {
                                if (static_cast<Label*>(pFiles.getChildren()[i])->getText() == label->getText())
                                    getListener().removeLater("2d"+static_cast<Label*>(pFiles.getChildren()[i])->getText());
                                else
                                    getListener().removeCommand("2d"+static_cast<Label*>(pFiles.getChildren()[i])->getText());
                            } else {
                                 if (static_cast<Label*>(pFiles.getChildren()[i])->getText() == label->getText())
                                    getListener().removeLater("2f"+static_cast<Label*>(pFiles.getChildren()[i])->getText());
                                 else
                                    getListener().removeCommand("2f"+static_cast<Label*>(pFiles.getChildren()[i])->getText());
                            }
                        }

    La commande en cours d'appel est détruite plus tard, et ça fonctionne.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Wow, tu te répètes beaucoup. À ta place, je factoriserais tous ces casts et la concaténation...

  8. #8
    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
    Sur un autre sujet tu te plaignais pas de perf ? Et en 5 lignes on voit 8 cast et déréférencement.
    Sans parler des égalités et créations de string.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-02074 dans Procedure appelée par VB
    Par Hobbi1 dans le forum Oracle
    Réponses: 2
    Dernier message: 03/07/2006, 13h50
  2. Delete de composant dans un GroupBox
    Par maw dans le forum C++Builder
    Réponses: 15
    Dernier message: 01/05/2006, 16h42
  3. [APPLET] beans dans applet appelé depuis une page HTML
    Par Néo-Tony dans le forum Applets
    Réponses: 1
    Dernier message: 04/01/2006, 14h54
  4. [JS] array dans un appel de fonction
    Par dib258 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/10/2005, 13h36
  5. [jsp] bean:write dans un appel js
    Par viena dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 18/10/2004, 15h15

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