Gelagat Tidak Dijangka dengan std::vector Out-of-Bounds Access
Dalam C , bekas std::vector digunakan secara meluas untuk mengurus tatasusunan dinamik. Walaupun kecekapannya dinilai tinggi, gelagat pelik timbul apabila mengakses elemen di luar julat yang ditentukan menggunakan pengendali [].
Pertimbangkan coretan kod berikut:
std::vector<double> vec; for (int i = 0; i < 6; ++i) { vec.push_back(i); } std::cout << vec.size() << std::endl; // Output: 6 std::cout << vec[6] << std::endl; // No error, but unexpected output
Anehnya, apabila cuba untuk akses vec[6], yang berada di luar batas, tiada ralat dilemparkan. Sebaliknya, nombor yang tidak dijangka dipaparkan sebagai output.
Penjelasan
Tidak seperti at() fungsi ahli std::vector, yang melakukan semakan sempadan, [] pengendali tidak. Apabila mengakses elemen di luar julatnya, pengendali [] mencetuskan gelagat yang tidak ditentukan. Ini boleh membawa kepada hasil yang tidak dapat diramalkan, termasuk kerosakan memori dan ranap sistem.
Gelagat khusus dalam kes ini bergantung pada pelaksanaan dan sistem pengendalian. Ada kemungkinan bahawa akses di luar sempadan membungkus ke permulaan vektor, atau ia boleh mengakses lokasi memori yang tidak dimulakan, menghasilkan nilai sampah.
Akibat
Tingkah laku ini boleh memperkenalkan ralat yang sukar dikesan dan nyahpepijat. Apabila vektor berkembang, titik penghujungnya boleh beralih, menjadikannya mencabar untuk meramalkan akibat daripada akses di luar sempadan.
Amalan Terbaik
Untuk mengekalkan kebolehpercayaan kod dan elakkan tingkah laku yang tidak ditentukan, adalah penting untuk mengelak daripada mengakses std:: elemen vektor yang di luar batasan. Sebaliknya, gunakan fungsi ahli at() untuk semakan sempadan atau pastikan indeks berada dalam julat yang sah sebelum menggunakan pengendali [].
Atas ialah kandungan terperinci Mengapa Akses Luar Sempadan dalam `std::vector` C menggunakan Operator `[]` Tidak Melempar Ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!