Kupas Tuntas Destruktor
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 24 dari 104.
destructor adalah fungsi anggota khusus yang dijalankan secara otomatis saat sebuah object dihancurkan. Tugas utamanya adalah melepaskan sumber daya yang diperoleh object selama masa hidupnya, seperti memori yang dialokasikan secara dinamis, handle file, atau koneksi jaringan.
Destructor memiliki nama yang sama dengan class, diawali dengan tilde ~. Destructor tidak menerima parameter dan tidak memiliki tipe pengembalian:
class FileHandler {
std::string filename;
int* buffer;
public:
FileHandler(std::string name, size_t size)
: filename(name), buffer(new int[size]) {
std::cout << "Opening " << filename << "\n";
}
~FileHandler() {
delete[] buffer;
std::cout << "Closing " << filename << "\n";
}
};Destructor dipanggil secara otomatis dalam situasi berikut:
- object stack keluar dari cakupan
deletedipanggil pada object yang dialokasikan di heap- Masa hidup object sementara berakhir
void example() {
FileHandler f1("data.txt", 100); // Konstruktor dipanggil
FileHandler* f2 = new FileHandler("log.txt", 50);
delete f2; // Destruktor dipanggil untuk f2
} // Destruktor dipanggil untuk f1 (keluar dari cakupan)Tidak seperti constructor, sebuah class hanya dapat memiliki satu destructor. Kamu tidak dapat melakukan overload padanya.
Jika kamu tidak mendefinisikannya, compiler akan membuat destruktor default yang tidak melakukan hal khusus, hanya menghancurkan setiap member. Untuk class yang mengelola sumber daya, kamu harus menulis destruktormu sendiri untuk mencegah kebocoran memori.
Tantangan
MudahMari kita buat pengelola sesi yang melacak sesi pengguna aktif dan menunjukkan cara destructor membersihkan resource secara otomatis saat object dihancurkan, baik saat keluar dari cakupan maupun saat dihapus secara eksplisit.
Kamu akan membuat dua file untuk mengatur kodemu:
Session.h: Definisikan classSessionyang merepresentasikan sesi pengguna aktif dengan data yang dialokasikan secara dinamis. Class-mu harus memiliki:- Member privat:
username(string),sessionId(int), dan pointer ke array integer bernamaactivityLogyang melacak tindakan pengguna, sertalogSizeuntuk ukuran array - Constructor yang menerima username, ID sesi, dan ukuran log. Constructor ini harus mengalokasikan array log aktivitas di heap, menginisialisasi semua elemennya dengan 0, dan mencetak
"Session <sessionId> started for <username>" - Destructor yang membebaskan memori yang dialokasikan dan mencetak
"Session <sessionId> ended for <username>" - Method
logActivity(int activityCode)yang menyimpan kode aktivitas di slot berikutnya yang tersedia (lacak posisi saat ini secara internal); jika log sudah penuh, pemanggilan ini diabaikan, sehingga jumlahnya tidak pernah melebihi ukuran log - Method
getActivityCount()yang mengembalikan jumlah aktivitas yang telah dicatat - Method
getUsername()yang mengembalikan username
- Member privat:
main.cpp: Tunjukkan perilaku destructor dalam berbagai skenario. Baca username dan ukuran log dari input (masing-masing pada baris terpisah), lalu:- Buat blok cakupan menggunakan kurung kurawal
{ }dan di dalamnya buatSessionyang dialokasikan di stack dengan username dari input, ID sesi101, dan ukuran log dari input. Catat dua aktivitas dengan kode1dan2, lalu cetak"Stack session activities: <count>". Saat blok berakhir, destructor harus berjalan secara otomatis. - Setelah blok, cetak
"Stack session destroyed" - Buat
Sessionyang dialokasikan di heap menggunakannew, dengan username"Guest", ID sesi202, dan ukuran log3. Catat satu aktivitas dengan kode5, cetak"Heap session activities: <count>", lalu hapus secara eksplisit dengandelete. - Setelah penghapusan, cetak
"Heap session destroyed"
- Buat blok cakupan menggunakan kurung kurawal
Tantangan ini menunjukkan dua cara utama destructor dipanggil: secara otomatis saat object stack keluar dari cakupan, dan secara manual saat kamu menghapus object heap. Kedua cara ini harus membebaskan log aktivitas yang dialokasikan secara dinamis dengan benar untuk mencegah kebocoran memori.
Sertakan file header-mu di main.cpp menggunakan #include "Session.h".
Coba sendiri
#include <iostream>
#include <string>
#include "Session.h"
using namespace std;
int main() {
// Baca input
string username;
int logSize;
getline(cin, username);
cin >> logSize;
// TODO: Buat blok cakupan dengan kurung kurawal { }
// Di dalam blok:
// - Buat Session yang dialokasikan di stack dengan username dari input, ID sesi 101, dan ukuran log dari input
// - Catat dua aktivitas dengan kode 1 dan 2
// - Cetak "Stack session activities: <count>"
// Saat blok berakhir, destruktor berjalan secara otomatis
// TODO: Setelah blok, cetak "Stack session destroyed"
// TODO: Buat Session yang dialokasikan di heap menggunakan new
// - Username: "Guest", ID sesi: 202, ukuran log: 3
// - Catat satu aktivitas dengan kode 5
// - Cetak "Heap session activities: <count>"
// - Hapus sesi
// TODO: Setelah dihapus, cetak "Heap session destroyed"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online