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 :

Double allocation de mémoire


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut Double allocation de mémoire
    Bonjour,
    Désolé pour le titre, mais une application de mon entreprise plante au bout d'un certain temps.
    j'ai besoin d'une aide sur un point voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Buffer = malloc(300);
      if ( (Buffer = malloc(300)) == NULL ) 
     blabla
    else
     
    free(buffer);
    endif
    J'ai l'impression qu'il y a une double allocation mémoire sur le buffer,
    Est-ce pénalisant ?
    Est-ce que ca ne change rien étant donné que c'est la même variable ?

    J'ai bien un free dans mon else, mais le 2ème malloc n'est pas libéré ???



    Merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    Tout d'abord merci à l'avenir d'utiliser un titre explicite en rapport avec ton problème. De plus, ici rien n'est urgent et les membres répondent ce qu'ils peuvent quand ils peuvent. Je t'invite à lire les règles du forum si ce n'est déjà fait.

    Ensuite, tu perds effectivement le buffer précédent avec la seconde allocation. Si celle-ci réussit tu auras une fuite mémoire, si elle échoue tu vas entrer dans le else et faire un "free(NULL)" ; je ne sais pas si c'est autorisé ou si ça mène à un plantage (en C++ on n'utilise plus malloc). Je te propose de simplement virer la seconde allocation dans le if, ainsi que le else qui ne sert à rien.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Ok merci pour ta réponse, ca confirme ce que je soupçonnait pour la fuite mémoire.

    Désolé pour le titre.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Pour compléter ma réponse, Le else nous sert à tracer les erreurs, docn si y a pas d'allocation, on mets un message informatif.


    Sinon tu dit qu'on n'utilise plus de malloc en C++, qu'utilise ton à la place ?

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut
    malloc est remplacé en c++ par l'utilisation de new

    Citation Envoyé par hunter001
    Pour compléter ma réponse, Le else nous sert à tracer les erreurs, docn si y a pas d'allocation, on mets un message informatif.
    bonne idée, mais il ne faut tester que le pointeur, pas toute la réallocation comme l'a dit loulou24

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    On utilise new:
    http://c.developpez.com/faq/cpp/?pag...S_pourquoi_new
    si l'allocation échoue, une exception est levée. Pas besoin de tester le succès alors, et tu peut gérer les erreurs d'allocation à un niveau plus élevé, de manière globale.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Ok nickel ça !!
    Mais après investigation, j'apprend que l'on n'utilise pas le new pour une histoire de compilateur trop ancien et gratuit qui ne gère pas les exceptions.

    Et que pour changer de compilateur, ya plein de conséquence (gestion des erreurs, revérification des codes .....)

    bref, apparemment on va continuer avec le malloc.

    En tout cas merci pour votre aide.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'espère que vous êtes conscients que ne pas utiliser new interdit tout usage des classes ou de la bibliothèque standard du C++. Dans ce cadre, êtes vous certains de ne pas vouloir coder en C plutôt ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    En fait grace au problème qu'on vient d'avoir, on va faire le forcing auprès des responsables pour changer de compilateur !
    Ca nous permettra d'être plus évolutif dans notre programmation et d'éviter ce genre d'erreur idiote!

    Maintenant, j'espère qu'il ne feront pas les sourdes oreilles.

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par hunter001
    Mais après investigation, j'apprend que l'on n'utilise pas le new pour une histoire de compilateur trop ancien et gratuit qui ne gère pas les exceptions.
    Quel compilateur ?
    Le cas courant est celui de VC++ 6 où new renvoie NULL comme malloc, au lieu de lever une exception.
    VC++ 6 n'est pas gratuit, est très vieux (1998 : il est sorti avant la norme C++...), possède de nombreux autres problèmes. Son support étendu s'arrête d'ailleurs le mois prochain, autant dire que du point de Microsoft ce produit n'existera plus.
    La version 7 et 7.1 sont sortis, la 8 arrive très prochainement (si vous devez changer VC++, attendez celle là). La version 7.1 est gratuite.
    Il existe aussi g++ comme très bon compilateur gratuit.
    Ca te fait des arguments en plus pour changer

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Tu va rire, nous utilisons Visual C++ 5 fourni avec le logiciel microsoft studio developer 97 !

    Bon j'envoi un petit mail à mes responsables avec tes arguments. Merci

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    En plus, passer à VS 7.1 ou 8 ne sera pas trop trop difficile, c'est dans la continuité

  13. #13
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Personellement j'ai jamais vu un new ou un malloc qui plantais... Et franchement si tu teste a chaque fois que tu alloue de la mémoire tu vas perdre un peu en performance pour rien celon moi...

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il suffit que tu aies une grosse appli et qu'il n'y ait plus assez de mémoire pour que ça puisse planter, il y a même un joli avertissement qui s'affiche dans ces conditions.
    Et si tu fais une allocation trop grosse sans t'en rendre compte ?

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Ou si le construteur de l'objet alloué lève un exception.
    Passer de VC++5 à VC++8 va tout de même nécessiter un peu de travail je pense. VC++5, c'est la préhistoire

  16. #16
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Il suffit que tu aies une grosse appli et qu'il n'y ait plus assez de mémoire pour que ça puisse planter, il y a même un joli avertissement qui s'affiche dans ces conditions.
    Ca veux dire plus de swap et plus de mémoire du tout ??? Je me demande si c'est ton appli ou ton OS qui plante en premier dans ces conditions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ou si le construteur de l'objet alloué lève un exception.
    C'est vrai, j'avais pas penser à ce cas précis.

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Du travail dans le bon sens

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  2. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  3. 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
  4. [Debutant]Allocation de mémoire
    Par gwendal84 dans le forum C
    Réponses: 6
    Dernier message: 07/12/2005, 19h04
  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