Menu
CoddyTech

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
  • delete dipanggil 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.

challenge icon

Tantangan

Mudah

Mari 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 class Session yang 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 bernama activityLog yang melacak tindakan pengguna, serta logSize untuk 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
  • 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 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, lalu cetak "Stack session activities: <count>". Saat blok berakhir, destructor harus berjalan secara otomatis.
    • Setelah blok, cetak "Stack session destroyed"
    • Buat Session yang dialokasikan di heap menggunakan new, dengan username "Guest", ID sesi 202, dan ukuran log 3. Catat satu aktivitas dengan kode 5, cetak "Heap session activities: <count>", lalu hapus secara eksplisit dengan delete.
    • Setelah penghapusan, cetak "Heap session destroyed"

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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online