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 :

Retourner un pointeur


Sujet :

C++

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Pour la fuite mémoire c'est simple : à chaque new doit correspondre un delete. Tu fait appel à un new mais à aucun delete => fuite mémoire.
    Et c'est surtout que tu n'as plus la possibilité de faire un delete sur la string. Car la string retournée est une copie de celle créée dynamiquement avec new.

    Il y a donc 2 objets string : celle retournée et celle créer dynamiquement dans la fonction. Ce sont 2 objet différents, leurs adresses ne sont pas identique : &returnedString != temp. Tu perds donc l'adresse de la string allouée dynamiquement, la mémoire ne pourra plus être libérée dans le programme puisque tu n'a plus de pointeur pointant sur l'objet dynamique pour faire un delete dessus.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Tu m'as l'air un peu perdu. Je me permet de résumé un poil les réponses.
    Citation Envoyé par mailaka Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int * AllocateAndPopulatePrimes(const int n){
       int *temp= new int[n];
     
       //// ici je remplis temp
     
      return temp;
    }
    Ou sont les pb ?
    En bref: Ta fonction crée un tableau sur le tas. La responsabilité de ce tableau est transférée au client (en gros, c'est de la responsabilité de celui qui appelle cette fonction de veiller à ce que la mémoire allouée dans ta fonction soit bien desallouée).
    Dans beaucoup d'articles ou de livres on qualifierais ta fonction de "source" (notamment les articles expliquant les auto_ptr).

    Il y a 2 problèmes distincts avec ce code:
    1) Le client de ta fonction ne sait pas a priori quel est le bon opérateur delete à appliquer afin de désallouer le tableau.
    2) Il y a une fuite mémoire potentielle si l'appelant décide de ne pas gérer le pointeur envoyé.

    Illustration du point 1:
    --
    Je décide d'utiliser ta fonction. En pratique tu me fournirais un fichier d'entête avec la déclaration de cette fonction. Un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef PREMS_HXX
    #define PREMS_HXX
      int * AllocateAndPopulatePrimes(const int n);
    #endif
    Je l'utilise donc:
    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
     
    // Mon Fichier à moi
    #include <prems.hxx>
    int main()
    {
      // Init
      int * lesPremiers = AllocateAndPopulatePrimes(10);
     
      // Je m'amuse avec les premier
      ...
     
      // Nettoyage: ARGH ! quelle fonction appeler ?
      delete lesPremiers;
      // Ou delete[] lesPremiers
    }
    Illustration du point 2:
    --
    Je suis un boulet et je ne suis interessé que par un possible effet de bord de ta fonction mais pas son résultat (lire: programmeur gros crade). Je peux écrire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <prems.hxx>
    int main()
    {
      AllocateAndPopulatePrimes(10);
      // YEP ! C'est de la fuite mémoire
    }
    Solutions Possibles:
    --
    La première des solutions que je ne vois pas mentionnée ici c'est documenter son code. Notamment, la documentation doit stipuler clairement qui assume la responsabilité des objets/tableaux alloués dynamiquement. Ce type de code n'est peut-être pas esthétique, mais il s'en trimbale des centaines d'exemples parmi l'héritage de code que chaque developpeur est amené à manipuler. Donc si tu ne souhaites pas mettre en place des méchanismes spécifiques pour éviter ces problèmes d'utilisation, le minimum vital c'est de documenter.

    Ensuite il existe bien sûr des solutions plus spécifiques qui on été mentionnée dans ce post.
    • Utilisation d'un vecteur (resoud les points 1&2)

    • Utilisation d'auto pointeurs ou pointeurs intelligents: élimine le problème de responsabilité et plus particulièrement le point 2. Cependant cela ne s'applique pas aisément aux tableaux


    Voilou, en espérant que cela aide. Sinon brûlez mon post

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/10/2005, 17h25
  2. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  3. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  4. fonction qui retourne un pointeur
    Par sorari dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2005, 21h23
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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