Berbagi teknologi

Penjelasan tentang masalah pencampuran delete dan delete yang tidak terdefinisi[]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Kita tahu bahwa delete digunakan untuk melepaskan ruang dinamis, dan delete[] digunakan untuk melepaskan beberapa ruang dinamis, tetapi masalah apa yang akan terjadi jika kita mencampurnya? Saya telah membaca banyak artikel di blog tetapi kurang memuaskan, jadi saya menulis artikel ini untuk memberi tahu Anda apa itu dan mengapa (Penjelasan yang dangkal, mohon koreksi saya)。

---------------------------------------------------------------------------------------------------------------------------------

Kita bisa melihat contohnya terlebih dahulu:

Hasil yang berjalan adalah:

Tetapi jika kita tidak menulis destruktornya secara eksplisit:

Hasilnya adalah operasi normal:

---------------------------------------------------------------------------------------------------------------------------------

Mengapa?

Jika saya bertanya kepada Anda berapa banyak ruang yang dialokasikan sistem untuk 10 objek Kelas A ini, kemungkinan besar Anda akan menjawab 40 byte.Sangat mudah untuk memahaminya. Satu A adalah 4 byte, dan 10 adalah 40 byte. .Namun kenyataannya, jika Anda menulis destruktor sendiri, total 44 byte akan dialokasikan. Jika Anda tidak menulis destruktor, total 40 byte akan dialokasikan.

Mengapa ada 4 byte lagi setelah menulis destruktor? Kita tahu bahwa setelah menggunakan delete untuk mengosongkan ruang ini, destruktor akan dipanggil secara otomatis (http://t.csdnimg.cn/f2FOj), (1) Jika kita menulis destruktornya sendiri, delete perlu memanggilnya (Faktanya, delete juga merupakan sebuah fungsi, yang setara dengan pemanggilan fungsi yang disarangkan.), maka berapa kali dipanggil adalah sebuah pertanyaan. Keempat byte ini sama persis dengan ukuran bilangan bulat. Bilangan bulat ini digunakan untuk mencatat jumlah objek dalam ruang ini, sehingga menentukan berapa kali konstruktor dan destruktor perlu dipanggil. ditelepon.Namun perlu anda ketahui bahwa penunjuk p tetap menunjuk pada objek pertama, namun akan maju untuk mendapatkan jumlah objek pada saat konstruksi dan penghancuran., hubungan spesifiknya adalah sebagai berikut:

(2) Jika kita tidak menulis destruktor saat ini, ia akan memanggil destruktor yang dihasilkan oleh kompiler tanpa mencatat berapa kali (mungkin melibatkan level yang lebih rendah, saya tidak yakin, tolong perbaiki saya), dan tidak perlu membuka operasi plastik tambahan.

Oke, sekarang kita bisa menjelaskan contoh di atas

Hapus melepaskan spasi dari posisi yang ditunjuk oleh penunjuk secara default; delete[] terlebih dahulu memeriksa apakah lebih banyak ruang yang dibuka secara default, dan jika demikian, gerakkan penunjuk ke depan satu posisi sebelum melepaskannya. Jika Anda membuka lebih banyak ruang atau menggunakan delete untuk mengosongkan ruang, maka ruang yang dibuka tidak dapat dilepaskan, sehingga menyebabkan kebocoran memori, sehingga dilaporkan kesalahan.

Apakah saya akan mendapatkan kesalahan jika saya mempraktikkannya? :

Tidak perlu memanggil destruktor, tidak perlu menghitung jumlah objek, dan tidak perlu membuka ruang lebih banyak sehingga ruang dapat dilepaskan dari posisi yang ditunjuk oleh penunjuk, sehingga tidak akan terjadi kesalahan dilaporkan.

Ada banyak situasi, Anda bisa turun dan mencobanya sendiri.

Saya tidak memiliki kemampuan untuk mengekspresikan diri. Silakan membacanya beberapa kali dan Anda pasti akan mendapatkan sesuatu.