Mengapa `baru` Kadangkala Mengembalikan NULL Daripada Melemparkan Pengecualian?

Linda Hamilton
Lepaskan: 2024-11-21 17:53:12
asal
811 orang telah melayarinya

Why Does `new` Sometimes Return NULL Instead of Throwing an Exception?

Baharu() Melemparkan Pengecualian NULL: Pematuhan Pengkompil

Piawaian C mewajibkan pengendali baharu membuang pengecualian std::bad_alloc apabila ia gagal memperuntukkan ingatan. Walau bagaimanapun, terdapat kebimbangan yang dibangkitkan tentang tingkah laku sesetengah penyusun, terutamanya VC6, yang mungkin tidak mematuhi piawaian ini.

Ketidakpatuhan VC6

Dalam kes ini daripada VC6, ia telah disahkan bahawa pengendali baharu sememangnya tidak mengikut piawaian secara lalai. Sebaliknya, ia mengembalikan 0 (NULL) apabila gagal. Tingkah laku ini menimbulkan cabaran kepada pembangun kerana ia memerlukan semakan eksplisit untuk NULL selepas setiap pernyataan baharu, menjadikan kod itu tidak menarik secara estetik.

Respons dan Penyelesaian Microsoft

Microsoft mengakui bukan ini -pematuhan dan menyediakan penyelesaian menggunakan pengendali baharu tersuai. Sebagai alternatif, pembangun boleh memanfaatkan fail objek nothrownew.obj untuk meniru gelagat VC6 dalam pengkompil MSVC yang lebih baharu (7.0 dan lebih baharu).

Keadaan Pematuhan Semasa

Mujurlah, dalam MSVC 8.0 (VS2005), tingkah laku lalai baharu telah dipinda untuk dipatuhi standard dan kini membuang pengecualian std::bad_alloc sekiranya berlaku kegagalan peruntukan memori. Pautan ke nothrownew.obj diperlukan hanya jika seseorang inginkan gelagat seperti VC6 yang asal.

Pilihan untuk Pulangan Null Manual

Pembangun mempunyai fleksibiliti untuk menentukan yang baharu itu harus return 0 dan bukannya membuang pengecualian dengan menggunakan std::nothrow parameter:

SomeType *p = new(std::nothrow) SomeType;
Salin selepas log masuk

Teknik ini membolehkan pendekatan yang konsisten merentas penyusun dan memudahkan penyelenggaraan kod dengan menghapuskan keperluan untuk mengubah suai mekanisme pengendalian ralat sedia ada.

Atas ialah kandungan terperinci Mengapa `baru` Kadangkala Mengembalikan NULL Daripada Melemparkan Pengecualian?. 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