Rumah > pembangunan bahagian belakang > C++ > Adakah `baru` dalam C Memulakan Memori kepada Sifar?

Adakah `baru` dalam C Memulakan Memori kepada Sifar?

Linda Hamilton
Lepaskan: 2024-12-11 06:53:09
asal
645 orang telah melayarinya

Does `new` in C   Initialize Memory to Zero?

Pengendali baharu Memulakan Memori kepada Sifar

Dalam C , pengendali baharu biasanya digunakan untuk peruntukan memori dinamik. Ia memperuntukkan blok memori saiz yang ditentukan dan mengembalikan penunjuk kepada memori yang diperuntukkan. Walau bagaimanapun, terdapat salah tanggapan umum bahawa baru tidak memulakan memori yang diperuntukkan dengan sifar. Artikel ini menjelaskan cara baharu memulakan ingatan, menangani percanggahan yang ketara.

Permulaan Lalai dan Sifar

Apabila menggunakan baharu untuk mencipta objek jenis primitif (mis., int , unsigned int), terdapat dua variasi:

  • wsk = baru int tidak ditandatangani; - Permulaan lalai: Tiada pemulaan dilakukan dan memori kekal tidak dimulakan.
  • wsk = new unsigned int(); - Permulaan sifar: Memori ditetapkan kepada sifar.

Perkara yang sama berlaku untuk tatasusunan:

  • wsa = int baru yang belum ditandatangani[5]; - Permulaan lalai
  • wsa = new unsigned int[5](); - Permulaan sifar

Penjelasan Permulaan Sifar

Walaupun baru secara amnya memulakan primitif dengan nilai tak tentu, pengecualian timbul apabila menggunakan sifar permulaan dengan sintaks kurungan kosong (baharu jenis();). Ini memulakan memori dengan sifar. Piawaian C 11 menyokong tingkah laku ini:

[C++11: 5.3.4/15]: A new-expression that creates an object of type T initializes that object as follows: [...] If the new-initializer is interpreted according to the initialization rules of 8.5 for direct-initialization.
Salin selepas log masuk

Peletakan Baharu

Peletakan baharu membenarkan memperuntukkan memori di lokasi tertentu. Menggunakan teknik ini dengan pemulaan sifar, ternyata bahawa ingatan sememangnya ditetapkan kepada sifar:

//... (memory allocation and initialization code)
wsa[0] = 1;  // Modify the memory location
wsa[1] = 2;  // Modify the memory location
// ... (more modifications)
//...
Salin selepas log masuk

Jika ingatan mengandungi nilai asal (1, 2, ...), maka permulaan sifar akan mempunyai gagal. Walau bagaimanapun, output mengesahkan bahawa memori yang diperuntukkan telah ditetapkan kepada sifar.

Oleh itu, walaupun yang baru biasanya tidak memulakan memori primitif dengan sifar, menggunakan sifar permulaan (jenis baru();) memulakan memori kepada sifar. Ini berlaku untuk kedua-dua peruntukan memori langsung dan peletakan baharu.

Atas ialah kandungan terperinci Adakah `baru` dalam C 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan