Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah `baru` Sentiasa Membuang `std::bad_alloc` dalam C ?

Adakah `baru` Sentiasa Membuang `std::bad_alloc` dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-11-17 08:50:03557semak imbas

Does `new` Always Throw `std::bad_alloc` in C  ?

Pengecualian Benar: Melebihi Norma dalam Pengurusan Memori C

Bertentangan dengan piawaian C, telah dilaporkan bahawa beberapa penyusun, seperti VC6, menyimpang daripada gelagat yang dijangkakan untuk mengembalikan pengecualian std::bad_alloc apabila baharu gagal memperuntukkan memori.

Biasanya, apabila baharu gagal memperoleh memori yang diminta, ia mencetuskan pengecualian std::bad_alloc, mematuhi yang ditetapkan piawaian C. Walau bagaimanapun, dalam kes VC6, pendekatan alternatif telah diambil.

Daripada mengembalikan pengecualian, VC6 dilaporkan mengembalikan 0 (atau NULL) apabila kegagalan peruntukan memori. Tingkah laku ini, yang berbeza daripada standard, boleh membawa kepada kekeliruan dan keputusan yang tidak dijangka dalam kod.

Untuk memerangi isu ini, Microsoft memperkenalkan pengendali baharu tersuai sebagai penyelesaian yang disyorkan. Walau bagaimanapun, dalam Visual C 7.0 dan 7.1 (VS2002 dan VS2003), satu set peraturan yang kompleks menentukan sama ada baharu akan berkelakuan dengan cara tidak membaling atau membaling.

Dengan keluaran Visual C 8.0 (VS2005), Microsoft menyelesaikan perkara itu dengan menguatkuasakan dasar yang konsisten. Dalam versi ini, new akan sentiasa lalai untuk membuang pengecualian, melainkan dikaitkan secara eksplisit dengan fail objek nothrownew.obj.

Untuk pembangun yang bekerja dengan kod lama yang direka untuk VC6, parameter std::nothrow boleh digunakan untuk meniru tingkah laku baru dalam pengkompil itu. Dengan menyatakan new(std::nothrow), kod boleh diubah secara mekanikal untuk berfungsi sama merentas penyusun berbeza, menghapuskan keperluan untuk membaik pulih mekanisme pengendalian ralat sedia ada.

Atas ialah kandungan terperinci Adakah `baru` Sentiasa Membuang `std::bad_alloc` dalam C ?. 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