Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa memadamkan tatasusunan objek terbitan dengan penuding asas dianggap Gelagat Tidak Ditakrifkan dalam C ?

Mengapa memadamkan tatasusunan objek terbitan dengan penuding asas dianggap Gelagat Tidak Ditakrifkan dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-01 03:42:02305semak imbas

Why is deleting an array of derived objects with a base pointer considered Undefined Behavior in 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:

  • Mengekalkan kecekapan untuk penggunaan tatasusunan yang sah
  • Membolehkan pelaksanaan tatasusunan polimorfik jika dikehendaki
  • Menghalang operasi tatasusunan yang salah dengan penunjuk terbitan

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!

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