Rumah > pembangunan bahagian belakang > C++ > Adakah `new unsigned int` Memulakan Memori kepada Sifar dalam C ?

Adakah `new unsigned int` Memulakan Memori kepada Sifar dalam C ?

Barbara Streisand
Lepaskan: 2024-12-08 13:45:12
asal
402 orang telah melayarinya

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

Pengendali baharu memulakan ingatan kepada sifar

Dalam coretan kod berikut:

#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;
}
Salin selepas log masuk

Hasil yang dijangkakan ialah memori tidak dimulakan kepada sifar, tetapi outputnya ialah:

wsk2: 0x928e008 5
wsk2: 0x928e008 0
Salin selepas log masuk

Nampaknya pengendali baharu sedang memulakan memori kepada sifar, tetapi sebenarnya tidak.

Cara ia berfungsi:

Terdapat dua versi pengendali baharu:

wsk = new unsigned int;      // default initialized (ie nothing happens)
wsk = new unsigned int();    // zero    initialized (ie set to 0)
Salin selepas log masuk

Pengamatan lalai berfungsi tidak memulakan memori, manakala permulaan sifar menetapkan memori kepada sifar.

Ia juga berfungsi untuk tatasusunan:

wsa = new unsigned int[5];   // default initialized (ie nothing happens)
wsa = new unsigned int[5](); // zero    initialized (ie all elements set to 0)
Salin selepas log masuk

Untuk mengesahkan bahawa memori sebenarnya disifarkan, kita boleh menggunakan peletakan baharu dengan sekeping ingatan yang diketahui:

#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";
}
Salin selepas log masuk

Output kod ini ialah:

0
0
0
0
0
Salin selepas log masuk

Yang mengesahkan bahawa memori sememangnya disifarkan oleh versi permulaan sifar operator baharu.

Atas ialah kandungan terperinci Adakah `new unsigned int` Memulakan Memori kepada Sifar dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan