Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Memadam Tatasusunan Terbitan melalui Tingkah Laku Tidak Ditakrifkan Penunjuk Asas dalam C ?

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

Barbara Streisand
Barbara Streisandasal
2024-10-31 16:54:02467semak imbas

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

Mengapa Tingkah Laku Tidak Ditakrifkan: Memadam Tatasusunan Terbitan melalui Penunjuk Asas

Piawaian C 03 menentukan bahawa memadamkan tatasusunan objek terbitan melalui penuding asas adalah tingkah laku yang tidak ditentukan. Ini disebabkan oleh perbezaan antara jenis statik dan dinamik objek yang akan dipadamkan.

Jenis Statik lwn Dinamik

Jenis statik penuding ialah jenis diisytiharkan dalam kod, manakala jenis dinamik ialah jenis sebenar objek yang ditunjuk. Dalam kod contoh:

<code class="cpp">struct B { virtual ~B() {} };
struct D : B {};

B* p = new D[20];</code>

Jenis statik p ialah B*, manakala jenis dinamik *p ialah D.

Tingkah Laku Tidak Ditakrifkan

Standard menyatakan bahawa dalam alternatif kedua (tatasusunan padam), jika jenis dinamik berbeza daripada jenis statik, tingkah laku tidak ditentukan. Ini kerana p tidak menunjuk kepada permulaan tatasusunan unsur D. Ia menunjuk kepada subjek B unsur pertama. Oleh itu, memadamkannya dengan padam [] p; tidak sah.

Pertimbangan Pelaksanaan

Menguatkuasakan peraturan ini dalam pelaksanaan memerlukan pengkompil untuk menentukan jenis dinamik tatasusunan dan kemudian secara dinamik menghantar p kepada jenis itu sebelum memadam. Walau bagaimanapun, ini akan memperkenalkan overhed yang tidak perlu dalam kes di mana polimorfisme tidak digunakan.

Tasusunan Polimorfik

Jika anda memerlukan tatasusunan dengan gelagat polimorfik, anda boleh mencipta pelaksanaan sendiri menggunakan kemudahan sedia ada C . Sebagai contoh, anda boleh mencipta templat kelas yang membungkus tatasusunan penunjuk kepada objek terbitan:

<code class="cpp">template <typename T>
class PolymorphicArray {
public:
    PolymorphicArray(size_t size) : _size(size), _data(new T*[_size]) {}
    ~PolymorphicArray() { delete[] _data; }
    T*& operator[](size_t index) { return _data[index]; }

private:
    size_t _size;
    T** _data;
};</code>

Kelas ini membolehkan anda menggunakan gelagat polimorfik pada tatasusunan objek terbitan tanpa melanggar Standard.

Atas ialah kandungan terperinci Mengapa Memadam Tatasusunan Terbitan melalui Tingkah Laku Tidak Ditakrifkan Penunjuk Asas 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