Rumah >pembangunan bahagian belakang >C++ >Mengapa memadamkan tatasusunan objek terbitan dengan penuding asas dianggap Gelagat Tidak Ditakrifkan dalam C ?
Mengapa Tingkah Laku Tidak Ditakrifkan untuk Memadam[] Susunan Objek Terbitan dengan Penunjuk Asas?
Piawaian C 5.3.5 [ expr.delete] menyatakan bahawa dalam kes "tatasusunan padam," tingkah laku tidak ditentukan berlaku jika jenis dinamik objek yang akan dipadamkan berbeza daripada jenis statiknya. Ini bermakna coretan kod berikut menggunakan gelagat yang tidak ditentukan:
<code class="cpp">struct B { virtual ~B() {} }; struct D : B {}; B* p = new D[20]; delete [] p; // undefined behavior</code>
Rasional untuk Gelagat Tidak Ditakrifkan
Operasi "padam []" memerlukan penuding kepada elemen pertama daripada tatasusunan. Walau bagaimanapun, apabila menggunakan penuding asas kepada tatasusunan objek terbitan, penuding sebenarnya merujuk kepada subobjek asas bagi elemen pertama. Oleh itu, operasi "padam []" akan cuba memadamkan subobjek asas dan bukannya elemen pertama tatasusunan, yang tidak betul.
Menguatkuasakan tingkah laku yang betul dalam kes ini akan melibatkan pengambilan semula jenis elemen bagi tatasusunan dan melakukan dynamic_cast kepada jenis itu. Walau bagaimanapun, ini akan memperkenalkan overhed yang tidak perlu untuk setiap tatasusunan polimorfik, walaupun apabila polimorfisme tidak digunakan.
Selain itu, penunjuk "p" itu sendiri adalah penggunaan terhad kerana ia hanya menunjuk kepada subjek asas. Operasi tatasusunan biasa seperti "p[i]" (untuk i > 0) tidak akan dapat dilakukan.
Kesimpulan
Tingkah laku yang tidak ditentukan untuk "padam [] " dengan penuding asas kepada tatasusunan objek terbitan ialah keputusan reka bentuk sedar yang:
Atas ialah kandungan terperinci Mengapa memadamkan tatasusunan objek terbitan dengan penuding asas dianggap Gelagat Tidak Ditakrifkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!