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
348 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!

sumber:php.cn
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