Rumah >pembangunan bahagian belakang >C++ >Bilakah Operator `baru` Memulakan Memori kepada Sifar?

Bilakah Operator `baru` Memulakan Memori kepada Sifar?

DDD
DDDasal
2024-12-19 00:56:18543semak imbas

When Does the `new` Operator Initialize Memory to Zero?

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:

  • wsk = int baru yang belum ditandatangani; // Default dimulakan (iaitu tiada apa yang berlaku)
  • wsk = new unsigned int(); // Sifar dimulakan (iaitu ditetapkan kepada 0)

Tingkah laku ini juga digunakan pada tatasusunan:

  • wsa = new unsigned int[5]; // Default dimulakan (iaitu tiada apa yang berlaku)
  • wsa = new unsigned int[5](); // Sifar dimulakan (iaitu semua elemen ditetapkan kepada 0)

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!

Kenyataan:
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