2009-07-14 6 views
3

Si j'initialise une classe POD avec un emplacement new, puis-je supposer que la mémoire sera initialisée par défaut (à zéros)? This resource indique clairement que si vous appelez le constructeur par défaut zero argument explicitement que les champs seront initialisés par défaut, mais il n'est pas clair si cela serait vrai en utilisant l'implémentation par défaut de placement new (passer une adresse). Est-ce un comportement standard pour que la mémoire soit mise à zéro dans ce cas?Classe POD initialisée avec placement new defaultized initialized?

+0

ce document est périmé. dans la révision standard '03, 'new T();' pour le POD et pour les non-POD sans les constructeurs déclarés par l'utilisateur, la valeur initialise, pas l'initialisation par défaut. Vous trouverez que l'initialisation en C++ est un gâchis. Je souhaite que SO aurait support de table –

+0

Ugh ... Je vois ce que vous dites. Je viens de trouver ce bug: http://qc.embarcadero.com/wc/qcmain.aspx?d=51854 Plus je lis, plus il me semble qu'il devrait être initialisé à zéro .. – elecengin

Répondre

3

Depuis le début:

5.3.4/15:

  • Si la nouvelle initialiseur est de la forme (), l'élément est la valeur initialisée (8,5);

8,5/5:

Pour valeur initialiser un objet de type T désigne:

  • si T est un type de classe (clause 9) avec un constructeur déclaré par l'utilisateur (12.1), le constructeur par défaut de T est appelé (et l'initialisation est mal formée si T n'a pas de constructeur par défaut accessible); Si T est un type de classe non-union sans constructeur déclaré par l'utilisateur, alors chaque membre de données non-statique et chaque composant de classe de base de T est initialisé en valeur;

  • si T est un type de tableau, alors chaque élément est initialisé en valeur;

  • autrement, l'objet est zéro initialisé

La première balle ne s'applique pas ici parce que vous avez un type POD et vous ne pouvez donc avoir un utilisateur déclaré constructeur. Les membres de votre type ne peuvent être que des types POD tels que int, float etc. ou une structure imbriquée qui est également un POD ou un tableau de types POD. Donc, finalement, chacun d'entre eux finit à la balle finale: "sinon, l'objet est initialisé à zéro".

Cette initialisation se produit car la classe POD est initialisée dans la mémoire que vous avez fournie. Peu importe que la mémoire ait été allouée par le système d'exploitation ou que vous ayez fourni une adresse. Donc, à mon humble avis, la réponse est oui - les membres seront initialisés à zéro.

+0

Merci! J'ai observé ce comportement dans mon code et je me demandais si c'était quelque chose sur lequel on pouvait se fier ou si mon compilateur/plate-forme venait de le faire. Effacé pour moi, +1 :) – Dan

Questions connexes