Maison > développement back-end > C++ > Quand le « nouvel » opérateur initialise-t-il la mémoire à zéro ?

Quand le « nouvel » opérateur initialise-t-il la mémoire à zéro ?

DDD
Libérer: 2024-12-19 00:56:18
original
429 Les gens l'ont consulté

When Does the `new` Operator Initialize Memory to Zero?

Nouvel opérateur et initialisation de la mémoire

Le nouvel opérateur est communément connu pour allouer de la mémoire sans l'initialiser. Cependant, un exemple de code récent révèle un scénario dans lequel la mémoire semble être initialisée à zéro lors de l'allocation à l'aide de new. Cela soulève des questions sur le comportement réel de l'opérateur.

Le 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;
}
Copier après la connexion

Sorties :

wsk2: 0x928e008 5
wsk2: 0x928e008 0
Copier après la connexion

La première allocation et initialisation de wsk2 à la valeur 5 fonctionne comme prévu. Cependant, la deuxième allocation et affectation de wsk2 à un nouvel int non signé sans initialiseur donne une valeur de 0.

Après une enquête plus approfondie, il devient évident qu'il existe deux versions du nouvel opérateur :

  • wsk = nouvel int non signé ; // Initialisé par défaut (c'est-à-dire que rien ne se passe)
  • wsk = new unsigned int(); // Zéro initialisé (c'est-à-dire défini sur 0)

Ce comportement s'applique également aux tableaux :

  • wsa = new unsigned int[5]; // Initialisé par défaut (c'est-à-dire que rien ne se passe)
  • wsa = new unsigned int[5](); // Zéro initialisé (c'est-à-dire tous les éléments mis à 0)

Un test personnalisé utilisant le placement new confirme que l'initialisation du zéro se produit bien :

#include <new>
#include <iostream>

int main() {
  unsigned int wsa[5] = {1, 2, 3, 4, 5};
  unsigned int *wsp = new(wsa) unsigned int[5]();
  std::cout << wsa[0] << "\n"; // If these are zero then it worked as described.
  std::cout << wsa[1] << "\n"; // If they contain the numbers 1 - 5 then it failed.
  std::cout << wsa[2] << "\n";
  std::cout << wsa[3] << "\n";
  std::cout << wsa[4] << "\n";
}
Copier après la connexion

Sorties :

0
0
0
0
0
Copier après la connexion

Cela démontre que le nouvel opérateur prend en charge l'initialisation nulle lorsqu'il est utilisé avec des parenthèses, malgré l'idée fausse courante selon laquelle il laisse de la mémoire non initialisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal