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++

  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 averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    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
    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 : 34
    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
    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
    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.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 708
    Points
    30 708
    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"

  6. #6
    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 : 34
    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
    @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).

  7. #7
    Membre chevronné
    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
    Points : 2 205
    Points
    2 205
    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.

  8. #8
    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 : 34
    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
    @Goten: C'est quel section de la norme ? Je n'arrive pas à la retrouver.

  9. #9
    Membre chevronné
    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
    Points : 2 205
    Points
    2 205
    Par défaut
    8.5 paragraphe 9 (au pire ctrl + f :p)

  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 : 34
    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
    Ton draft est pas à jour (ou alors tu citais la norme actuel ?), le passage que tu cites n'existe plus. (n3090)
    Note: Every object of static storage duration is zero-initialized at program startup before any other initialization
    takes place. In some cases, additional initialization is done later. —end note
    Mais la réponse reste juste, et se trouve toujours au 8.5, complété par le 5.3.4 pour new (ce qui donne au final le comportement que j'ai décrit plus haut pour un tableau de int).

    Edit: J'ai fait ctrl+f, et j'ai pas trouvé pour ca que je te demandais .

  11. #11
    Membre chevronné
    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
    Points : 2 205
    Points
    2 205
    Par défaut
    Je me réfère à la norme la seule et unique. Le reste ne sont que des drafts pour 0x, sachant que y'en a pléthore et que les compilers n'implémentent pas tout voir rien, pour ce genre de chose je cite la norme.

+ 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, 08h03
  2. Réponses: 6
    Dernier message: 23/05/2009, 17h29
  3. Réponses: 2
    Dernier message: 12/05/2007, 02h57
  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, 15h31
  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, 14h02

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