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 :

Fuite mémoire ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Par défaut Fuite mémoire ?
    Bonjour,

    j'ai écrit il y a quelques années un petit programme en C/C++ consititué de plusieurs fonctions. L'une d'entre elles a pour but de retourner un pointeur sur le premier élément d'un tableau d'entier. Est ce que je ne génère pas une fuite mémoire ? Si oui, quel est l'impact sur les serveurs où il s'exécute de manière infinie ?

    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
    int *DateHeure()
    {
         int Date[6];
         date Date_avance;
         struct time Heure;
         getdate(&Date_avance);
         gettime(&Heure);     
         Date[0]=int(Date_avance.da_day);
         Date[1]=int(Date_avance.da_mon);
         Date[2]=int(Date_avance.da_year);      
         Date[3]=int(Heure.ti_hour);
         Date[4]=int(Heure.ti_min);
         Date[5]=int(Heure.ti_sec);    
         return &Date[0];
    }
    Je suis novice en programmation et de l'aide est bienvenue.

    par avance Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    c'est surtout que tu généres un comportement indéterminé.....

    Date est une variable locale..

    Dont tu retournes l'adresse, soit..

    MAIS cette varaible n'a plus de sens dès qu'on est sorti de la fonction...

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 357
    Par défaut
    Pour être tout à fait clair :

    1- il n'y a pas de fuite mémoire

    2. Ton tableau Date est une variable locale à la fonction, ce qui signifie que l'espace mémoire occupée par cette variable est libéré dès que la dite fonction se termine.
    Or tu retournes l'adresse de ce tableau. La mémoire étant libérée elle peut être réutilisée à n'importe quel moment par le programme (d'où le caractère non déterministe souligné par Souviron). Du coup il y a de fortes chances pour que les valeurs que tu lises soient fausses...

    [Edit] Tu as répondu entre temps

    Dans tout bon OS les processus tournent dans des espaces mémoires séparés et tu ne peux pas allouer dans un espace qui n'appartient pas à ton processus.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    une manière plus adaptée serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void DateHeure(int *Date)
    où Date est declaré (dimensionné) dans la routine appellante

    OU

    où Date est déclaré comme pointeur dans la routine, puis alloué (via malloc ou calloc), et où tu retournes le pointeur.

    Cependant, avec cette manière, il te faut libérer la mémoire dans la routine appellante une fois que tu n'en as plus besoin.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Furikawari Voir le message
    Dans tout bon OS les processus tournent dans des espaces mémoires séparés et tu ne peux pas allouer dans un espace qui n'appartient pas à ton processus.
    Par contre, il est possible d'allouer de la mémoire partagée entre plusieurs processus. Mais c'est souvent casse gueule et c'est rarement vraiment utile.


    Sinon, je plussoie Furikawari, sur les ordinateurs "normaux", il y a un composant qui s'appelle la MMU qui permet au processus de ne pouvoir lire que dans sa zone de mémoire virtuelle

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Par défaut Fuite mémoire ?
    Si je comprends bien, je récupère un pointeur sur une variable locale qui est désalloué lorsque je sors de la fonction et qui peut être réalloué pour une autre utilsation à n'importe quel moment. Est ce que je suis dans le vrai ?

    Lorsque je récupère l'adresse de mon tableau (retourné par ma fonction) dans un pointeur d'entier int*Date, je parviens à lire son contenu mais je pourrais très bien retourner quelque chose d'autre.

    Puis je faire un accès dans une zone non autorisés dédiée à un autre processus (Oracle par exemple shm .....) ?

    Merci de ta réponse

  7. #7
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par catdor Voir le message
    j'ai écrit il y a quelques années un petit programme en C/C++
    Ce serait plus un message pour le forum C/C++ alors non ? Parce que les "langages en général" ne posent absolument pas ce genre de problème, c'est assez spécifique à ces deux là.

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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