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 des allocations mémoires


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut Gestion des allocations mémoires
    Bonjour,

    Ma question concerne la gestion des allocations mémoires. Il s'agit plus d'une question concernant les méthodes que d'une question purement technique: disons que dans une fonction, je réalise de multiples allocations via new (std::nothrow). A chaque new, je teste si l'allocation a réussi. Du coup, je me retrouve avec pleins de if imbriqués les uns dans les autres, comme ci dessous:
    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
     
    int *a = NULL;
    int *b = NULL;
    int *c = NULL;
    a = new (std::nothrow) int;
    if(a)
    {
      b = new (std::nothrow) int;
      if(b)
      {
        c = new (std::nothrow) int;
        if(c)
        {
          /* ... */
        }
      }
    }
    Par curiosité, je me demandais si il existait une méthode de programmation pour la gestion des new, qui diffère de la précédente.

    Cordialement,

    Julien.

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Oui, la bonne méthode est de ne rien tester.

    Si tu en es au point ou tu dois tester les new (qui dans la plupart des implémentations vont lancer une exception de toutes façons), alors c'est que soit ton programme est trop gros pour ton hardware, soit ton hardware est trop gros pour ton programme.

    Ne test pas les new. Si un new rate, ça va te crasher rapidement à la gueule

    Et ça sera pas à la gueule du client, donc tu peux corriger le problème en amont.

    C'est juste absurde (et non-recommandé par ces messieurs du standard) de vérifier les new.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Salut,

    Donc tu sous-entends que le new ne crash jamais si il a suffisamment d'espace mémoire pour allouer l'objet ? Contrairement au malloc qui lui crasherait également pour d'autres raisons (puisque le test est préconisé pour le malloc) ?

    Julien.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Je précise tout de même que je suis dans un contexte "système embarqué".

    Julien.

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Pourquoi tu passes par les versions nothrow ? Les versions normales qui lancent une exception si l'allocation échoue ne te conviennent pas ? Parce que là tu te retrouves en effet à devoir tester tout tes new (donc à devoir faire comme en C).

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Alors il s'agit d'une règle de codage de l'entreprise, les exceptions sont interdites. Mais peu importe, si le new vous gène, remplaçons l'exemple précédent par du malloc. Les if imbriqués dans l'exemple précédent ne vous "choque" donc pas ?

    Cordialement,

    Julien.

  7. #7
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int *a = nullptr; // plus mieux
    int *b = nullptr;
    int *c = nullptr;
    a = new (std::nothrow) int;
    if(!a) return;
    b = new (std::nothrow) int;
    if(!b) return;
    c = new (std::nothrow) int;
    if(!c) return;
    /* ... */

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Khan34 Voir le message
    Salut,

    Donc tu sous-entends que le new ne crash jamais si il a suffisamment d'espace mémoire pour allouer l'objet ? Contrairement au malloc qui lui crasherait également pour d'autres raisons (puisque le test est préconisé pour le malloc) ?

    Julien.
    Non, le new echouera (tout comme malloc) si le systeme (OS ou pas) ne peut pas allouer l espace demande au moment demande, quelle que soit la raison.

    Si tu alloues un objet tres tres tres gros alors peut etre qu il y a un interet a verifier les new, mais ce n est pas la norme, c est une exception (sans jeu de mot).

    La plupart du temps si ton new echoue, tu ne peux rien faire d autre que quitter l application ou ne rien faire du tout, ce qui reviens globalement a la meme chose. Dans tous les cas, par defaut, ne test pas les new, c est inutile.


    Si tu as un cas bien specifique ou tester le new a du sens, lache toi, sinon ce n est pas necesaire.

    En fait tout depends du context de l appel.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Ok, merci pour toutes ces réponses.

    Julien.

  10. #10
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @Klaim: Je suis d'accord qu'on ne peut rien faire, mais si on test pas le retour des versions nothrow on se retrouve à déréférencer des pointeurs nuls.

  11. #11
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    @Klaim: Je suis d'accord qu'on ne peut rien faire, mais si on test pas le retour des versions nothrow on se retrouve à déréférencer des pointeurs nuls.
    J ai dit "la plupart du temps". Les cas ou ca deviens utile de faire quelque chose sont rare et reserves a des contextes extremes ou critique ( au sens ou des vies sont en jeu ). Dans les autres cas, ca n a aucun sens et on arrive a rien de reellement utile. Meme faire un log peut faire cracher l application a ce point la.

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

Discussions similaires

  1. Gestion des allocations dynamiques de mémoire.
    Par Franck.H dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h24
  2. Réponses: 2
    Dernier message: 23/08/2007, 12h22
  3. Réponses: 6
    Dernier message: 23/02/2007, 21h20
  4. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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