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;
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!