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!