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; }
Hasil yang dijangkakan ialah memori tidak dimulakan kepada sifar, tetapi outputnya ialah:
wsk2: 0x928e008 5 wsk2: 0x928e008 0
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)
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)
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"; }
Output kod ini ialah:
0 0 0 0 0
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!