Opérateur de nouveaux initialise la mémoire à zéro

Il y a un tel code:

#include <iostream>

int main(){
  unsigned int* wsk2 = new unsigned int(5);
  std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl;
  delete wsk2;
  wsk2 = new unsigned int;
  std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl;
  return 0;
}

Résultat:

wsk2: 0x928e008 5
wsk2: 0x928e008 0

J'ai lu que new ne pas initialiser la mémoire avec des zéros. Mais ici, il semble qu'il n'. Comment ça fonctionne?

  • Il n'est pas le cas, vous devez utiliser le nouveau unsigned int(). La lecture de variables non initialisées UB, un 0 est certainement possible.
  • En aparté, dans la pratique, beaucoup de mémoire est nul de toute façon. Si vous faites une plaine malloc d'une grande partie de la mémoire, il est souvent tout à zéro sur certains systèmes, ou la plupart du zéro sur les autres.
  • Pour la plupart des systèmes, cela n'est vrai que lorsque la mémoire est venu directement à partir de l'OS (pour des raisons de sécurité). Quand il est venu à partir de la mémoire cache par l'allocateur, il est probable qu'il contient tout ce qu'il a fait avant c'était gratuit()d. C'est aussi une raison pour laquelle de tels bugs, parfois, ne se pose pas dans le cas de tests/tests unitaires, mais seulement après un certain temps de la "vraie" programme en cours d'exécution. Valgrind à la rescousse ici.
  • Oui. C'est le genre de mon point de vue. Si vous faites une nouvelle variable et de voir que c'est zéro, vous ne pouvez pas tout de suite supposer que quelque chose dans votre programme a mis à zéro. Depuis plus de mémoire est prêt à zéro, il est probablement non initialisée. Je pense que ma remarque est en fait plus proche pour répondre à la question que la plupart des réponses ci-dessous, parce que l'interlocuteur a voulu savoir pourquoi la mémoire non initialisée pourrait être de zéro.
  • Essayez de l'allocation d'un tableau, le réglage de tous les éléments pour certaines valeur différente de zéro, puis de les supprimer[] et le répartir de nouveau - seul le premier élément sera remis à zéro - autres conservent leurs valeurs - qui je pense est un pecurliarity de l'allocateur de mémoire (testé sous Linux).
  • Liées (demande pour les tableaux): stackoverflow.com/questions/2204176/...

InformationsquelleAutor scdmb | 2011-09-25