Pemusnah dan Pembersihan
Lepaskan sumber secara automatik
Pemusnah dan Pembersihan ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Perkara yang Dilakukan oleh Pemusnah
Pemusnah dijalankan apabila jangka hayat objek berakhir. Tugasnya ialah melepaskan apa sahaja yang dimiliki oleh objek tersebut. Namanya ialah ~ClassName.
#include <iostream>
class File {
public:
~File() { std::cout << "closing file\n"; }
};
int main() {
File f;
} // ~File runs hereMembebaskan Memori yang Dimiliki
Jika sesuatu kelas memiliki memori timbunan, pemusnahnya mesti membebaskan memori tersebut. Inilah tempat klasik untuk memanggil delete.
#include <iostream>
class Buffer {
int* data;
public:
Buffer(int n) : data(new int[n]) {}
~Buffer() { delete[] data; } // cleanup
};
int main() { Buffer b(10); }Pemusnah Dijalankan Secara Automatik
Anda tidak memanggil pemusnah sendiri untuk objek tindanan — pengkompil menyisipkan panggilan tersebut pada akhir skop.
Susunan Terbalik Ahli
Objek ahli dimusnahkan dalam susunan terbalik daripada pengisytiharan mereka, selepas badan pemusnah selesai dijalankan.
#include <iostream>
struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
A a;
B b; // destroyed before a
~C() { std::cout << "~C\n"; }
};
int main() { C c; }Pemusnah Maya
Jika Anda memadamkan objek terbitan melalui penuding asas, pemusnah asas mesti bersifat virtual — jika tidak, bahagian terbitan akan bocor.
#include <iostream>
struct Base {
virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
~Derived() override { std::cout << "~Derived\n"; }
};
int main() {
Base* p = new Derived();
delete p; // both run thanks to virtual
}Pemusnah Tidak Sepatutnya Melontarkan Pengecualian
Melontarkan pengecualian daripada pemusnah semasa pengunduran tindanan akan menamatkan program. Pemusnah hendaklah ditanda secara (tersirat) sebagai noexcept dan tidak membenarkan pengecualian terlepas.
Pemusnah Lalai
Jika Anda tidak menulisnya, pengkompil menjana pemusnah yang memusnahkan setiap ahli. Bagi kelas yang hanya mempunyai ahli RAII, itulah pilihan yang tepat.
#include <string>
#include <vector>
struct Record {
std::string name; // self-cleaning
std::vector<int> values; // self-cleaning
}; // default destructor is enoughPemusnah Lalai Eksplisit
Tulis ~Class() = default; untuk meminta secara eksplisit pemusnah yang dijana pengkompil — berguna apabila Anda memerlukan pemusnah maya tetapi tiada logik tersuai.
#include <iostream>
struct Shape {
virtual ~Shape() = default; // virtual + default
};Melepaskan Sumber Bukan Memori
Pemusnah juga menutup fail, melepaskan kunci dan memutuskan sambungan soket — bukan sekadar membebaskan memori. Setiap sumber yang diperoleh harus diuruskan di sini.
Susunan Merentas Objek
Beberapa pemboleh ubah setempat dimusnahkan dalam susunan pembinaan terbalik, jadi pemusnah boleh menggunakan objek yang dicipta sebelum objeknya dengan selamat.
Biarkan Ahli RAII Menjalankan Tugas
Jika setiap ahli ialah jenis RAII, biasanya Anda tidak memerlukan pemusnah tersuai langsung. Simpan pemusnah yang ditulis sendiri untuk sumber mentah.
Semakan Pantas
Uji pemahaman Anda tentang pemusnah.
Rumusan
Anda telah mempelajari bahawa pemusnah melepaskan sumber yang dimiliki secara automatik pada akhir jangka hayat, menjalankan ahli mengikut susunan pengisytiharan terbalik, tidak boleh melontarkan pengecualian dan perlu bersifat virtual dalam kelas asas polimorfik. Ahli RAII sering menjadikan pemusnah tersuai tidak diperlukan.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Pemusnah dan Pembersihan” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Pemusnah dan Pembersihan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pemusnah dan Pembersihan”?
Lepaskan sumber secara automatik Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Pemusnah dan Pembersihan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Prinsip RAII
- Pemusnah dan Pembersihan
- Peraturan Tiga/Lima
- Pengawal Skop