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

Bilakah Operator `baru` Memulakan Memori kepada Sifar?

DDD
Lepaskan: 2024-12-19 00:56:18
asal
427 orang telah melayarinya

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

Output:

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

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

Output:

0
0
0
0
0
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan