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 :

initialisation d'un tableau de int avec new


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut initialisation d'un tableau de int avec new
    Bonjour,

    Je créé un tableau de int avec l'opérateur new, et j'ai remarqué que tous les éléments sont initialisés automatiquement à zéro.

    Je me demande si ce comportement peut-être une spécificité de mon compilateur, ou s'il est garanti par la norme c++.

    Si ce comportement est garanti, je pourrais arrêter d'écrire des zéros partout à chaque fois.

    Merci.

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Non ce n'est pas du tout garanti par la norme.
    Pour tout mètre a zéro, il est possible d'utiliser la fonction fill. Mais la solution fortement conseillée est généralement d'utiliser un std::vector, a la place d'un tableau alloué par un new. (Le vector met tout a zero par defaut)

  3. #3
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Ca depend de la facon dont tu fais ton new. Si tu fais new int[1](); alors l'initialisation à zéro est garantie, si tu fais new int[1]; aucune initialisation ne doit être faite.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Sauf erreur, il me semble qu'il est défini dans la norme que tout ce qui peut être défaut initialisé ou zéro initialisé le sera.

    Autrement dit, et pour autant que je ne me plante pas sur ce coup, on aurait la certitude que les valeur numériques seraient initialisées à 0, car il existe des "pseudo constructeurs" pour ces types

    Il faut d'ailleurs noter que new [] ne peut être utilisé que, justement, avec des types défaut constructibles

    Ceci dit, j'appuie très fortement Nogane lorsqu'il conseille d'utiliser la classe vector, disponible dans l'espace de noms std par simple inclusion du fichier <vector>, pour la gestion des tableaux de taille dynamique.

    Son utilisation est beaucoup plus sécurisante que l'utilisation des tableaux "C style"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @Koala: Quand tu utilises new, la norme spécifie que si le new-initializer (ce qui est à la fin dans mon exemple) n'existe pas alors l'objet est defaut-initialisé (donc pour un tableau de int, les éléments sont tous defaut-initialisé, et pour un int ca correspond à aucune initialisation), dans le cas contraire ce sont les règles d'initialisation classique qui s'applique, donc si tu mets () c'est une value-initialisation (donc pour un tableau de int, les éléments sont tous value-initialisé, et pour un int ca correspond à une zero-initialisation).

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Sauf erreur, il me semble qu'il est défini dans la norme que tout ce qui peut être défaut initialisé ou zéro initialisé le sera.

    Autrement dit, et pour autant que je ne me plante pas sur ce coup, on aurait la certitude que les valeur numériques seraient initialisées à 0, car il existe des "pseudo constructeurs" pour ces types
    Non :

    9 If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; if the object is of const-qualified type, the underlying
    class type shall have a user-declared default constructor. Otherwise, if no initializer is specified for a non-static object, the object and its subobjects, if any, have an indeterminate initial value; if the object or any
    of its subobjects are of const-qualified type, the program is ill-formed.

  7. #7
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @Goten: C'est quel section de la norme ? Je n'arrive pas à la retrouver.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse.

    En ce qui concerne les std::vector, c'est vrai que j'aurais du y penser.

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

Discussions similaires

  1. Tableau de base avec une variable INT aléatoire
    Par stemariej dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 11/12/2009, 07h03
  2. Réponses: 6
    Dernier message: 23/05/2009, 16h29
  3. Réponses: 2
    Dernier message: 12/05/2007, 01h57
  4. comparer 2 tableau de int avec marge d erreur
    Par jerome86600 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 17/07/2006, 14h31
  5. comparer 2 tableau de int avec marge d erreur
    Par jerome86600 dans le forum Visual C++
    Réponses: 0
    Dernier message: 14/07/2006, 13h02

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