Mengapa Memadam Susunan Objek Terbitan melalui Tingkah Laku Tidak Ditakrifkan Penunjuk Asas dalam C ?

Patricia Arquette
Lepaskan: 2024-10-30 07:31:27
asal
711 orang telah melayarinya

Why is Deleting an Array of Derived Objects via a Base Pointer Undefined Behavior in C  ?

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>
Salin selepas log masuk

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:

  • Tatasusunan tidak menyokong tingkah laku polimorfik untuk mengelakkan menghukum penggunaan yang sah.
  • Pemadaman polimorfik tatasusunan boleh dilaksanakan secara berasingan jika diperlukan.

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!