Pourquoi est une GOUSSE dans une struct initialisé à zéro par un constructeur implicite lors de la création d'un objet dans le tas ou un objet temporaire dans la pile?

La norme et la C++ livre dire que le constructeur par défaut pour le type de classe des membres est convoquée par le implicites générées constructeur par défaut, mais des types intégrés ne sont pas initialisés. Cependant, dans cet essai, programme, j'obtiens des résultats inattendus lors de l'allocation d'un objet dans le tas ou lors de l'utilisation d'un objet temporaire:

#include<iostream>


struct Container
{
    int n;
};

int main()
{
    Container c;
    std::cout << "[STACK] Num: " << c.n << std::endl;

    Container *pc = new Container();
    std::cout << "[HEAP]  Num: " << pc->n << std::endl;
    delete pc;

    Container tc = Container();
    std::cout << "[TEMP]  Num: " << tc.n << std::endl;

}

J'obtiens ce résultat:

[STACK] Num: -1079504552
[HEAP]  Num: 0
[TEMP]  Num: 0

Ce n'est pas de compilateur spécifique de comportement? Je n'ai pas vraiment l'intention de s'appuyer sur cela, mais je suis curieux de savoir pourquoi cela se produit, spécialement pour le troisième cas.

  • double possible de par Défaut Struct Initialisation en C++
  • j'imagine que le segment en lui-même est initialisé avec des zéros
  • Je pensais la même chose sur le tas de cas, peut-être que c'était juste des zéros par hasard, mais je trouve l'objet temporaire en cas surprenant.
  • voir le lien posté par @acéré, il a l'explication de la temp cas
  • La plupart des systèmes d'exploitation en tant que mesure de sécurité est égal à zéro des pages de la mémoire avant de les manipuler à un processus (pour éviter un processus d'être en mesure d'inspecter les autres processus de la mémoire). Le résultat de ceci est que, le plus souvent, un simple cas de test qui vient de mallocs va de l'initialisation de la mémoire (pas vraiment, mais il va ressembler), tandis que la pile a plus de chances d'être modifiés par les précédents appels de fonction.