Menu
CoddyTech

Pola Destruktor

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 13 dari 61.

Setiap object yang dibuat dengan malloc pada akhirnya harus dibebaskan. Sama seperti saat kita menulis fungsi create_ untuk menangani alokasi, kita menulis fungsi free_ untuk menangani pembersihan. Ini adalah pola destruktor.

Intinya, proses pembebasan harus dilakukan dalam urutan terbalik dari alokasi. Jika constructor-mu mengalokasikan anggota internal terlebih dahulu, lalu struct itu sendiri, destructor-mu harus membebaskan anggota struct terlebih dahulu, lalu struct itu sendiri:

typedef struct {
    char *name;
    int age;
} Person;

void free_person(Person *p) {
    if (p == NULL) return;  // Periksa keamanan
    free(p->name);          // Bebaskan anggota internal terlebih dahulu
    free(p);                // Lalu bebaskan struct itu sendiri
}

Pemeriksaan NULL di awal mencegah crash jika seseorang tidak sengaja memberikan pointer yang tidak valid. Setelah membebaskan string name internal, kita membebaskan struct itu sendiri. Jika kita membebaskan p terlebih dahulu, kita akan kehilangan akses ke p->name dan menyebabkan kebocoran memori.

Menggunakan destructor itu mudah:

Person *alice = create_person("Alice", 30);
// ... gunakan alice ...
free_person(alice);  // Bersihkan setelah selesai

Pola ini memastikan semua memori dibebaskan dengan benar. Tanpanya, setiap object yang kamu buat akan menyebabkan kebocoran memori sampai programmu kehabisan memori.

challenge icon

Tantangan

Mudah

Mari kita buat module Movie yang menunjukkan siklus hidup object secara lengkap: pembuatan dan penghancuran. Kamu akan berlatih menulis fungsi destruktor yang membersihkan semua memori yang dialokasikan dengan benar dan dalam urutan yang tepat.

Kamu akan membuat tiga file:

  • movie.h: Deklarasikan struct Movie dengan dua anggota: char *title (string yang dialokasikan secara dinamis) dan int year. Deklarasikan konstruktor create_movie yang menerima judul dan tahun, serta destruktor free_movie yang menerima pointer ke Movie. Gunakan pelindung include dengan simbol MOVIE_H.
  • movie.c: Implementasikan kedua fungsi tersebut. Konstruktor harus mengalokasikan memori untuk struct dan string judulnya (jangan lupa terminator null). Destruktor harus membebaskan memori dalam urutan kebalikan dari alokasinya: pertama string title internal, lalu struct itu sendiri. Sertakan pemeriksaan NULL di awal destruktor sebagai langkah pengamanan.
  • main.c: Buat sebuah film, tampilkan informasinya, lalu bersihkan memorinya dengan benar.

Kamu akan menerima dua input: judul film (sebuah string) dan tahun rilis (sebuah bilangan bulat).

Di file utama, gunakan create_movie untuk membuat film baru, cetak informasinya, lalu panggil free_movie untuk membebaskan semua memori. Setelah membebaskan memori, cetak pesan konfirmasi.

Cetak output dengan format berikut:

Movie: {title} ({year})
Memory freed

Contohnya, dengan input Inception dan 2010, outputnya adalah:

Movie: Inception (2010)
Memory freed

Ingat: kunci untuk membuat destruktor yang benar adalah membebaskan memori dalam urutan terbalik. Apa pun yang pertama kali dialokasikan oleh konstruktor dibebaskan terakhir, dan apa pun yang terakhir kali dialokasikan dibebaskan pertama.

Coba sendiri

#include <stdio.h>
#include <stdlib.h>
#include "movie.h"

int main() {
    char title[100];
    int year;
    
    // Baca input
    scanf("%[^\n]", title);
    scanf("%d", &year);
    
    // TODO: Buat film menggunakan create_movie
    
    // TODO: Cetak informasi film dalam format:
    // Movie: {title} ({year})
    
    // TODO: Bebaskan memori film menggunakan free_movie
    
    // TODO: Cetak "Memory freed"
    
    return 0;
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online