Penghapus Kustom dan Fungsi Make
Gunakan std::make_unique, std::make_shared, dan penghapus kustom untuk sumber daya nonmemori
Penghapus Kustom dan Fungsi Make adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Mengapa Menggunakan Penghapus Khusus?
Tidak semua sumber daya dibebaskan dengan delete. Handel berkas, soket, sumber daya khusus OS, dan larik masing-masing memerlukan fungsi pembersihan yang berbeda.
Penghapus Bawaan untuk unique_ptr
Secara bawaan, unique_ptr<T> menggunakan delete. Untuk larik, gunakan unique_ptr<T[]> yang memanggil delete[].
Menentukan Penghapus Khusus
Berikan objek yang dapat dipanggil sebagai argumen templat kedua. Penghapus tersebut menerima penunjuk mentah dan membebaskannya dengan cara yang sesuai.
auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(
std::fopen("data.txt", "r"), closer);Penghapus untuk shared_ptr
shared_ptr menyimpan penghapusnya di dalam blok kontrol — tipenya dihapus, sehingga tipe shared_ptr itu sendiri tidak berubah.
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Kasus Penggunaan Umum Penghapus Khusus
Contoh di dunia nyata:
- Handel pustaka C (FILE*, sqlite3*, handel curl)
- Sumber daya OS (HANDLE di Windows, fd di Unix)
- Pool memori khusus
- Objek eksternal dengan penghitung referensi
std::make_unique (C++14)
Cara yang disarankan untuk membuat unique_ptr. Meneruskan argumen ke konstruktor dan menghindari new mentah.
auto p = std::make_unique<Widget>(arg1, arg2);Mengapa make_unique?
Tiga manfaat:
- Keamanan terhadap pengecualian — tidak ada
newmentah dalam kode pengguna - Tidak perlu mengetikkan tipe dua kali
- Tidak mungkin secara tidak sengaja meneruskan penunjuk mentah ke dua unique_ptr
std::make_shared
Untuk shared_ptr, make_shared mengalokasikan blok kontrol dan objek dalam satu alokasi memori heap — lebih cepat daripada alokasi terpisah.
auto p = std::make_shared<Widget>(arg1, arg2);Saat make_shared Memiliki Kekurangan
Alokasi tunggal berarti memori objek hanya dibebaskan setelah semua weak_ptr juga tidak ada lagi. Jika weak_ptr Anda bertahan lebih lama daripada shared_ptr, pilih konstruksi dua langkah.
Menggabungkan Penghapus Khusus dengan make
make_unique dan make_shared tidak menerima penghapus khusus secara langsung. Dalam kasus tersebut, buat penunjuk pintar secara manual.
// make_shared cannot take a deleter
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Jebakan: Tipe Lambda sebagai Parameter Templat
Setiap lambda memiliki tipe yang unik. Untuk unique_ptr, gunakan decltype(my_deleter) saat mendeklarasikannya; atau gunakan fungsi bernama atau penunjuk fungsi agar tipe tetap sederhana.
Pemeriksaan Singkat
Fungsi pabrik mana yang memungkinkan Anda mengalokasikan std::shared_ptr dan blok kontrolnya dalam satu alokasi memori heap?
Ringkasan
Gunakan make_unique dan make_shared untuk kasus umum. Berikan penghapus khusus (lambda atau fungsi) jika sumber daya memerlukan lebih dari delete — handel berkas, objek OS, atau pembersihan pustaka C.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penghapus Kustom dan Fungsi Make” gratis?
Ya — teks lengkap “Penghapus Kustom dan Fungsi Make” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penghapus Kustom dan Fungsi Make”?
Gunakan std::make_unique, std::make_shared, dan penghapus kustom untuk sumber daya nonmemori Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Penghapus Kustom dan Fungsi Make” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Pointer Cerdas Menggantikan new dan delete Mentah
- unique_ptr: Kepemilikan Eksklusif
- shared_ptr dan weak_ptr: Kepemilikan Bersama
- Penghapus Kustom dan Fungsi Make