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 :

Allocation / liberation 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
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Par défaut Allocation / liberation mémoire
    Bonjours,

    Voila un problème que notre prof nous à posé sans nous donnée de corriger et que je ne comprends pas :

    Il s'agit de défénir quelle est la place (en octets) prise dans la mémoire après les opérations suivantes :


    char *p;
    p = (char *)malloc(100000);

    p = (char *)malloc(100000);
    free(p);

    p = (char *)malloc(100000);
    free(p)

    Le problème est que je ne sais pas exactement ce que libère free :
    p étant défénit comme un pointeur sur un char, free(p) libère 1 octet ou l'ensemble de la zone mémoire allouée?

    La réponse du prof est 200012 mais je n'y arrive pas.

    1) Si free libère la taille du type pointé alors :
    1 + 100000 + 100000 - 1 + 100000 - 1 soit 299'999 octets

    2) Si free libère entièrement la zone mémoire alors :

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    free(p) libère 1 octet ou l'ensemble de la zone mémoire allouée?
    free(p) libère l'ensemble de la mémoire allouée par malloc.

    La réponse du prof est 200012 mais je n'y arrive pas.
    Moi non plus

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Faudra que que ta prof revoit un peu ses bases

    La deuxième et la troisième allocation sont toutes les deux libérées. Par contre la première allocation n'est pas libérée. Donc après le bout de code que tu donnes, il y a 100000 octets d'alloués.

    Si tu veux le compter tu as aussi 4 ou 8 octets (suivant la taille des pointeurs sur ton architecture) utilisés pour la variable p elle même... Mais bon ça je pense qu'on peut oublier.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je plussoie diogene. La réponse du prof me parait complètement extravagante.

    PS: Depuis l'errata du K&R2, il est officiellement considéré comme mauvaise pratique de caster le retour de malloc() en C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Par défaut
    Tout d'abord merci pour vos réponses !


    Oui mon prof n'est plus du tout à jour et ce n'est pas la première fois que je remarque des erreurs dans le travail qu'il nous donne.

    Donc la réponse correcte sur une archi 32bits et bien

    2) Si free libère entièrement la zone mémoire alors :
    4 + 100000 = 100004 octets

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Quel compilateur as-tu ?
    Le plus simple c'est d'utiliser le débuggeur intégré.
    Sous Visual C++ tu mets un breakpoint et tu peux examiner la fenêtre mémoire.
    Mieux vaut essayer avec des petites allocations mémoires par exemple malloc (30).

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Par défaut
    Encore une fois merci pour vos réponses !

    Mat.M
    Quel compilateur as-tu ?
    Je suis sons linux donc pas de visual
    J'utilise Netbeans.

    Emmanuel Delahaye
    Le bilan a la fin est donc de 100004 char occupés en mémoire, dont 100000 perdus (fuite mémoire).
    Merci pour ta confirmation !

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dna0002 Voir le message
    La réponse du prof est 200012 mais je n'y arrive pas.
    Voici la chronologie des évènements (sur une architecture dont les pointeurs occupent 4 char) :
    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
    16
    17
     
    /* reservation statique de 4 char  : 4 */
    char *p;
    /* allocation dynamique de 100000 char : 100004 */
    p = (char *)malloc(100000);
     
    /* allocation dynamique de 100000 char : 200004 */
    p = (char *)malloc(100000);
     
    /* liberation des 100000 derniers char alloues : 100004 */
    free(p);
     
    /* allocation dynamique de 100000 char : 200004 */
    p = (char *)malloc(100000);
     
    /* liberation des 100000 derniers char alloues : 100004 */
    free(p)
    Le bilan a la fin est donc de 100004 char occupés en mémoire, dont 100000 perdus (fuite mémoire).
    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
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (1365 rec)
    SYSALLOC Successful initialization: 1365 records available
    done in 0 s
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC Err: Not-matched list:
    SYSALLOC Bloc 00260048 (100000 bytes) malloc'ed at line 9 of 'C:\dev\mem\main.c'
     not freed
    SYSALLOC Released Memory
    FRMWRK.Execution terminated
     
    Process returned 0 (0x0)   execution time : 0.067 s
    Press any key to continue.
    Ton prof se trompe.

Discussions similaires

  1. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  2. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  3. [Debutant]Allocation de mémoire
    Par gwendal84 dans le forum C
    Réponses: 6
    Dernier message: 07/12/2005, 19h04
  4. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

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