Mengapa Memadam Tatasusunan Objek Terbitan melalui Penunjuk Asas boleh Tidak Ditakrifkan
Dalam C , tingkah laku memadam tatasusunan tidak ditentukan jika jenis dinamik objek berbeza daripada jenis statiknya. Ini digariskan dalam Standard C 03 (5.3.5 [expr.delete] p3): "Dalam alternatif kedua (tatasusunan padam), jika jenis dinamik objek yang akan dipadam berbeza daripada jenis statiknya, tingkah laku tidak ditentukan ."
Untuk menggambarkan, pertimbangkan coretan kod berikut:
<code class="cpp">struct B { virtual ~B() {} }; struct D : B {}; B* p = new D[20]; delete[] p; // undefined behavior</code>
Walaupun kelihatan intuitif untuk memadamkan tatasusunan objek terbitan menggunakan penuding asas, Standard menetapkan ini sebagai tingkah laku yang tidak ditentukan . Ini kerana penuding asas p menghala ke subobjek asas bagi elemen pertama dalam tatasusunan, bukannya elemen pertama itu sendiri.
Melaksanakan pemadaman polimorfik tatasusunan memerlukan pengambilan semula jenis elemen, melakukan lakonan dinamik, dan kemudian melakukan pemadaman biasa[]. Walau bagaimanapun, ini akan dikenakan overhed yang tidak perlu walaupun polimorfisme tidak digunakan.
Oleh itu, untuk mengelakkan tingkah laku yang tidak ditentukan dan overhed yang tidak perlu, adalah penting untuk diingat bahawa tatasusunan tidak boleh berkelakuan secara polimorfik. Sebaliknya, jika tingkah laku polimorfik diingini, ia boleh dilaksanakan secara berasingan.
Ringkasnya:
Atas ialah kandungan terperinci Mengapa Memadam Susunan Objek Terbitan melalui Tingkah Laku Tidak Ditakrifkan Penunjuk Asas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!