Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Objective-C] Crash de NSOpenPanel

Corruption mémoire

    19 avril 2012 à 13:23:53

    Bonjour !

    Je ne parviens pas à résoudre le problème suivant depuis un bon bout de temps :

    À un moment de mon programme, j'appelle une fonction fselect pour choisir un fichier en utilisant la boîte de dialogue standard NSOpenPanel.
    Dans fselect j'exécute simplement ce bout de code :

    /* 
        ...
    char *fichier = malloc(...);
    fselect();
        ...
    */
    
    int fselect()
    {
           int ret=0;
    
           NSOpenPanel *panel = [NSOpenPanel openPanel];
    
    //début partie A
           if([panel runModal] == NSOKButton)
           {
                  ret=1;
           }
    //fin partie A
    
           return ret;
    }
    
    /*
       ...
    free(fichier);
       ...
    */
    


    À l'exécution, la boîte de dialogue s'ouvre correctement, mais dès que l'on quitte la boîte de dialogue (via les boutons Cancel ou Open), l'application crash avec un message d'erreur du type :
    "free error : block memory is corrupted"

    Et cette erreur ne se produit pas si je mets en commentaire la Partie A !

    Quelqu'un aurait une idée, ou juste de la documentation sur ce crash ?

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      19 avril 2012 à 14:05:11

      Salut, ce n'est pas ce morceau de code qui créé le problème, mais un autre, tu fais sûrement un free sur un pointeur qui n'est pas valide. Si tu es sous Xcode, utilise GuardMalloc qui va trouver où est le problème (dépassement de tampon, double free ou autre…).

      (Attention tu n'es pas dans le bon forum).
      • Partager sur Facebook
      • Partager sur Twitter
        19 avril 2012 à 14:18:49

        Merci pour ces premières informations, je vais regarder ça.

        Désolé pour le classement du sujet, mais je n'ai pas trouvé où parler d'Objective-C sur mac. Car on parle bien de programmation sur Mac et pas de programmation mobile pour iPad ou iPhone !

        [EDIT] : mais dans ce cas comment cela se fait-il qu'il n'y ait jamais aucun problème de mémoire si seulement la partie A est mise en commentaire ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          19 avril 2012 à 14:36:55

          L'inconvénient de la gestion de mémoire avec les pointeurs et allocations dynamiques est qu'une erreur est difficile à repérer. Lorsque tu appelles la méthode run de NSOpenPanel, celle ci écrit peut-être à un endroit qui fait que plus tard, ton programme plante sans raison apparente. Vérifie bien que tu n'écrive pas en dehors d'un tableau, ou que tu libères 2 fois un pointeur ou autre…
          • Partager sur Facebook
          • Partager sur Twitter
            19 avril 2012 à 15:54:19

            J'ai donc exécuté mon programme en cochant la case "enable GuardMalloc". Le programme s'exécute plus lentement, ce qui est normal, mais je ne parviens pas à obtenir d'information supplémentaire. Est-ce que c'est censé afficher des messages en plus dans la console ?

            J'ai aussi essayé "Malloc Stack" et "Log Exception" mais je n'arrive pas à ouvrir le log généré...
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              20 avril 2012 à 0:37:24

              Ben normalement avec MallocDebug d'activé, le programme va planter dès qu'une erreur est commise dans la gestion de la mémoire, quelle est le contenu de la ligne sur laquelle s'arrête l'exécution ?
              • Partager sur Facebook
              • Partager sur Twitter

              [Objective-C] Crash de NSOpenPanel

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown