Pengendali Baharu dan Permulaan Memori
Pengendali baharu biasanya dikenali untuk memperuntukkan memori tanpa memulakannya. Walau bagaimanapun, contoh kod baru-baru ini mendedahkan senario di mana memori kelihatan dimulakan kepada sifar apabila diperuntukkan menggunakan baharu. Ini menimbulkan persoalan tentang kelakuan sebenar pengendali.
Kod:
#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; }
Output:
wsk2: 0x928e008 5 wsk2: 0x928e008 0
Peruntukan pertama dan permulaan wsk2 kepada nilai 5 beroperasi seperti yang dijangkakan. Walau bagaimanapun, peruntukan dan penugasan kedua wsk2 kepada int baru yang tidak ditandatangani tanpa pemula menghasilkan nilai 0.
Setelah siasatan lanjut, ternyata terdapat dua versi pengendali baharu:
Tingkah laku ini juga digunakan pada tatasusunan:
Ujian tersuai menggunakan peletakan baharu mengesahkan bahawa permulaan sifar memang berlaku:
#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"; }
Output:
0 0 0 0 0
Ini menunjukkan bahawa pengendali baharu menyokong pengamulaan sifar apabila digunakan dengan kurungan, walaupun terdapat tanggapan salah umum bahawa ia meninggalkan ingatan tidak dimulakan.
Atas ialah kandungan terperinci Bilakah Operator `baru` Memulakan Memori kepada Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!