Maison > développement back-end > C++ > Est-ce que `new unsigned int` initialise la mémoire à zéro en C ?

Est-ce que `new unsigned int` initialise la mémoire à zéro en C ?

Barbara Streisand
Libérer: 2024-12-08 13:45:12
original
347 Les gens l'ont consulté

Does `new unsigned int` Initialize Memory to Zero in C  ?

L'opérateur new initialise la mémoire à zéro

Dans l'extrait de code suivant :

#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

Le résultat attendu est que la mémoire n'est pas initialisée à zéro, mais le résultat est :

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

Il semble que l'opérateur new initialise la mémoire à zéro, mais ce n'est en fait pas le cas.

Comment ça marche :

Il existe deux versions de l'opérateur new :

wsk = new unsigned int;      // default initialized (ie nothing happens)
wsk = new unsigned int();    // zero    initialized (ie set to 0)
Copier après la connexion

L'initialisation par défaut ne initialiser la mémoire, tandis que l'initialisation à zéro met la mémoire à zéro.

Cela fonctionne également pour arrays :

wsa = new unsigned int[5];   // default initialized (ie nothing happens)
wsa = new unsigned int[5](); // zero    initialized (ie all elements set to 0)
Copier après la connexion

Pour confirmer que la mémoire est effectivement mise à zéro, nous pouvons utiliser le placement new avec un morceau de mémoire connu :

#include <new>
#include <iostream>


int main()
{
    unsigned int   wsa[5] = {1,2,3,4,5};

    // Use placement new (to use a know piece of memory).
    // In the way described above.
    // 
    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

La sortie de ce code est :

0
0
0
0
0
Copier après la connexion

Ce qui confirme que la mémoire est bien mise à zéro par la version zéro initialisation de l'opérateur new.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal