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.
Tantangan
MudahMari 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 structMoviedengan dua anggota:char *title(string yang dialokasikan secara dinamis) danint year. Deklarasikan konstruktorcreate_movieyang menerima judul dan tahun, serta destruktorfree_movieyang menerima pointer ke Movie. Gunakan pelindung include dengan simbolMOVIE_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 stringtitleinternal, 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 freedContohnya, dengan input Inception dan 2010, outputnya adalah:
Movie: Inception (2010)
Memory freedIngat: 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online