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 :

gestion d'allocation (similaire au garbage collector).


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut gestion d'allocation (similaire au garbage collector).
    Bonjour,

    Je voudrais faire une gestion d'allocation/désallocation dans mon programme.
    J'ai donc suivi ce tuto

    http://haypo.developpez.com/article/halloc/

    Quelque point sont encore obscure, mais je m'en dépatouille.
    Bref, ce que je voudrais, c'est étendre ceci aux librairie externe.

    J'ai bien compris que malloc/free & Cie etait "rediriger" vers une autre fonction grace aux define, mais cette redirection ne marche que si on a inclue GestionMemoire.h (c'est comme ca que je l'appele).
    Par contre, les malloc/free & Cie d'une librairie tel que la SDL ne seront pas rediriger car il n'y a pas le include.

    D'ou mes question :

    * Peut-on demander que les malloc/free d'une lib externe soit rediriger grace aux define de GestionMemoire.h ?
    * Peut-on mettre une option dans le makefile qui nous permettrait d'inclure GestionMemoire.h partout sans qu'il y ait d'appel explicite dans le code ?
    * Si oui, cela marcherai t'il pour la SDL ?

    J'ai bien une idée de réponse (non), mais comme il se peut que je sois passé a coté de quelque chose, je demande.

    Merci de votre lecture.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Par défaut
    Le plus souvent, tu vas devoir considèrer que la lib que tu utilises est irréprochable.

    ce qu'il faut surveiller ce sont tes allocs et désallocs...

    Dans le cas de la SDL que tu cites, comment veux tu, avec le préprocesseur jouer sur une lib dèjà compilée? Oo...

    Le trou s'il y a c'est toi qui le provoque, donc tu dois surveiller tes alloc...
    Rien ne t'empèche de créer des (fonctions, macros...), pour chaque fonction de la lib que tu utilise qui crèe ou libère des ressources.

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut
    C'est donc bien ce que je pensait.

    En fait, j'aurais préférer "détecter" tout les malloc, car ca m'aurait amplement simplifier la vie.

    J'explique.
    Dans le cas de simple malloc dans mon programme sans aucune lib externe (mis a part stdlib.h), aucun soucis.
    Mon questionnement provient du fait que souvent, en cas d'erreur, je fait un bel
    exit (EXIT_FAILURE) en laissant a charge de l'OS de tout desalloué.
    Or, ce n'est pas propre et surtout, tout les OS ne font pas des desallocation en fin de vie de programme.
    Donc, ce que j'aurai voulu, c'est savoir quand la fonction malloc est appelé et sur combien de mémoire pour que je puisse lister et donc vider ces allocations.
    Le probleme survient avec les malloc par fonction interposé, comme fopen pour FILE*, SDL_LoadBMP pour SDL_Surface* et ca continue.

    Si je ne peux pas detecter les malloc, alors je dois detecter les appel a fonction (fopen, SDL_LoadBMP ...) et surtout, je dois retenir quelle fonction je devrais appelé en cas de probleme.

    Ca engendre donc une surcharge de fonction alors que si on avait accées au appel malloc, ca serait plus simple.

    D'ou mes question qui peuvent te paraitre idiote, mais voila, je sais pas tout et j'esperai une petite astuce.


    Je devrais donc refaire toute les fonction d'appel ...

  4. #4
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Or, ce n'est pas propre et surtout, tout les OS ne font pas des desallocation en fin de vie de programme.
    Ce n'est pas "propre", c'est optimisé.
    La mémoire virtuelle est fonction d'un processus, si on kill l'application, cette mémoire qui comme son nom l'indique est virtuelle, n'existe plus.
    Certes ont pourrais en trouver trace dans la ram et alors?
    Il ne faut pas vider la mémoire après avoir fini de l'utiliser mais l'initialiser avant de l'utiliser, c'est tout
    C'est a l'OS de gerer la ram pas a ton application.

    Citation Envoyé par SofEvans Voir le message
    Donc, ce que j'aurai voulu, c'est savoir quand la fonction malloc est appelé et sur combien de mémoire pour que je puisse lister et donc vider ces allocations.
    Tu entends quoi par vider? mettre 0 partout?
    Si tu y tiens vraiment, tu appeles atexit avec ta fonction my_free qui fait memset sur tout le heap mais l'interet est absolument nul.

    Citation Envoyé par SofEvans Voir le message
    Ca engendre donc une surcharge de fonction alors que si on avait accées au appel malloc, ca serait plus simple.
    Tu peux utiliser ton malloc partout, sous les systemes unix il te suffis de renseigner la variable LD_PRELOAD dans un shell.
    Il est d'ailleurs révélateur d'ajouter un compteur (en variable statique) au fonction malloc et free et de faire une simple soustraction sur des applications comme firefox ou the gimp

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par sloshy Voir le message
    Ce n'est pas "propre", c'est optimisé.
    La mémoire virtuelle est fonction d'un processus, si on kill l'application, cette mémoire qui comme son nom l'indique est virtuelle, n'existe plus.
    Certes ont pourrais en trouver trace dans la ram et alors?
    Il ne faut pas vider la mémoire après avoir fini de l'utiliser mais l'initialiser avant de l'utiliser, c'est tout
    C'est a l'OS de gerer la ram pas a ton application.
    Tu comptes ici sur le fait que l'OS libère automatiquement toute la mémoire allouée par programme lors de la fin de l'exécution. Ce comportement est effectivement celui présent sur de nombreux systèmes (dont Linux et Windows) mais n'est pas, à ma connaissance, garantie partout.

    Si le but est de faire un programme portable sur des systèmes n'ayant pas ce comportement sans provoquer de fuite mémoire, il faut bel et bien libérer toute la mémoire allouée dynamiquement soi-même et ne pas compter sur l'OS pour le faire.

    Citation Envoyé par sloshy Voir le message
    Tu entends quoi par vider? mettre 0 partout?
    Dans le cadre de la question, je comprends plutôt "libérer" (donc appel à malloc).
    C'est vrai que le terme "vider" n'est pas le plus clair qu'il soit.

  6. #6
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    La seul chose libérable sur un systeme (disposant d'un OS s'entend) est le heap. un simple brk(0); sur une fonction pointee par atexit() et on en parle plus.
    Hors c'est le role d'un OS de gerer la memoire globale, pas d'une application utilisateur.

    Il faut faire confiance a l'OS pour ca.

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

Discussions similaires

  1. [Gestion mémoire] Garbage collector, mais quand intervient-t-il ?
    Par jldgbu dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 01/05/2008, 17h55
  2. Réponses: 6
    Dernier message: 01/03/2007, 12h31
  3. JPanel et Garbage Collector
    Par tck-lt dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 25/07/2005, 18h03
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum Général Java
    Réponses: 7
    Dernier message: 02/06/2005, 16h57
  5. [Language]Garbage collector
    Par GETah dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2005, 15h18

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