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 :

Initialiser une variable au départ d'une fonction


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Points : 60
    Points
    60
    Par défaut Initialiser une variable au départ d'une fonction
    Bonjour qu'arrive t'il à ma variable déclarée dans ma fonction lorsque je fait ceci S = ChargerImages(); ? Cette fonction retourne un pointeur qui défini ma nouvelle variable S mais du coup, es que j'ai bien 2 variables qui pointent sur une seule texture en mémoire ? Es que j'ai tord de libérer qu'une seule texture à la fin de mon programme ? (le principe est plus ou moins le même avec Glut sauf que j'utilise GlDeleteTexture(1,...) ).
    fonction 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sprites* ChargerImages()
    {
        Sprites* S;
        int i;
     
        S = malloc(NbSprites*sizeof(Sprites));
     
        S[0].sprite = IMG_Load("images/sky.png");
    ..
        return S;
    }
    fonction 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void LibererMap(Map* m, Sprites* S)
    {
        SDL_FreeSurface(S[0].sprite);
    ..
        free(S);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void game()
    {
        Sprites* S;
        S = ChargerImages();
        LibererMap(m,S);
    }

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 106
    Points
    43 106
    Par défaut
    En principe, si tu appeles plusieurs fois ChargerImages(), il te faut libérer la mémoire de chaque objet.

    Aptrès si tu libères juste en fin de programme, aucun intérêt. Quitter le programme libère toute sa RAM.

    Là ou tu dois être vigilent, c'est si tu décharge des images en cours d’exécution, et en recharge d'autres.

    Pour répondre à la question :
    qu'arrive t'il à ma variable déclarée dans ma fonction lorsque je fait ceci S = ChargerImages(); ?
    la variable S de la fonction game est différente de la variable S de la fonction chargerImage. A la sortie de ChargerImage (), sa variable S est détruite. Mais son contenu a été transmis à la variable de la fonction appelante par return. Si tu appelles un malloc sans faire un free dessus, tu génères une fuite mémoire, la mémoire allouée n'est plus utilisée et inaccessible car tu n'a aucun pointeur qui a son adresse pour y accéder.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre du Club
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Points : 60
    Points
    60
    Par défaut
    Si tu appelles un malloc sans faire un free dessus, tu génères une fuite mémoire, la mémoire allouée n'est plus utilisée et inaccessible car tu n'a aucun pointeur qui a son adresse pour y accéder.
    Je reviens sur ce que j'ai dit. Dans une fonction timer, je risque de charger/décharger encore et encore mon image !
    Donc, il me semble logique de faire un free après mon return pour libérer mon second S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sprites* ChargerImages()
    {
        Sprites* S;
        int i;
        S = malloc(NbSprites*sizeof(Sprites));
        S[0].sprite = IMG_Load("images/sky.png");
    ..
        return S;
    free(S)
    }

    Une fois que je quitte mon menu "Jeu", je peux libérer mon premier S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void LibererMap(Map* m, Sprites* S)
    {
        SDL_FreeSurface(S[0].sprite);
    ..
        free(S);
    }
    Aptrès si tu libères juste en fin de programme, aucun intérêt. Quitter le programme libère toute sa RAM.
    Merci.

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ce que retourne ta fonction est une copie.
    Les pointeurs copiés pointent vers le même espace mémoire.
    Ce qu'on libère c'est l'espace mémoire alloué, non le pointeur. Le pointeur est juste la manière d'accéder à cet espace.
    Si tu as 2 pointeurs qui pointent sur le même espace mémoire, tu ne dois pas libérer 2 fois le pointeur mais 1 fois l'espace mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* s = malloc(sizeof(char) * 15);
    char* s2 = s;
    free(s2);
    //free(s); non, s et s2 pointent vers la même chaîne / le même espace mémoire, on ne le libère qu'une fois
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il y a des moyens de savoir les fuites de mémoire

    Par exemple avec Visual C++, tu as Visual Leak Detector (à n'activer qu'en debug).
    Avec C++ Embarcadero, tu as CodeGuard (<- lien en anglais)

  6. #6
    Membre du Club
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Points : 60
    Points
    60
    Par défaut
    Merci. J'ai installé valgrind mais j'ai eu très peu l'utilité voir pas du tout jusqu'à présent. Je compile avec -Wall -Wextra .. mais merci, j'essaye ça cette semaine. Je crois que ça ne me ferais de mal, pour l'anglais aussi tient. ^^

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

Discussions similaires

  1. Initialiser une fonction sur un clic
    Par nicolas2603 dans le forum jQuery
    Réponses: 3
    Dernier message: 17/04/2013, 17h29
  2. Réponses: 3
    Dernier message: 24/02/2013, 23h36
  3. Réponses: 15
    Dernier message: 25/10/2012, 12h32
  4. Réponses: 9
    Dernier message: 03/05/2010, 19h40
  5. Réponses: 4
    Dernier message: 19/04/2006, 16h03

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