Destructor Deseni
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 13 / 61.
malloc ile oluşturulan her nesne sonunda serbest bırakılmalıdır. Bellek ayırmayı yönetmek için bir create_ işlevi yazdığımız gibi, temizleme işlemini yönetmek için de bir free_ işlevi yazarız. Bu, yıkıcı desenidir.
Temel çıkarım, serbest bırakma işleminin tahsis sırasının tersine göre gerçekleşmesi gerektiğidir. Yapıcınız önce dahili üyeleri, ardından yapının kendisini tahsis ettiyse, yıkıcınız önce yapının üyelerini, sonra da yapıyı serbest bırakmalıdır:
typedef struct {
char *name;
int age;
} Person;
void free_person(Person *p) {
if (p == NULL) return; // Güvenlik kontrolü
free(p->name); // Önce dahili üyeyi serbest bırak
free(p); // Sonra yapının kendisini serbest bırak
}
Başlangıçtaki NULL kontrolü, biri yanlışlıkla geçersiz bir işaretçi geçirirse çökmeleri önler. Dahili name dizesini serbest bıraktıktan sonra yapının kendisini serbest bırakırız. Önce p değişkenini serbest bıraksaydık, p->name öğesine erişimi kaybeder ve bellek sızıntısına neden olurduk.
Yıkıcıyı kullanmak basittir:
Person *alice = create_person("Alice", 30);
// ... alice'i kullan ...
free_person(alice); // Bittiğinde temizle
Bu kalıp, tüm belleğin düzgün bir şekilde serbest bırakılmasını sağlar. Bu kalıp olmadan oluşturduğunuz her nesne, programınızın belleği tükenene kadar bellek sızdırırdı.
Görev
KolayHem oluşturmayı hem de yok etmeyi gösteren eksiksiz bir nesne yaşam döngüsünü sergileyen bir Movie modülü oluşturalım. Ayrılan tüm belleği doğru sırayla düzgün şekilde temizleyen bir yıkıcı işlev yazma pratiği yapacaksın.
Üç dosya oluşturacaksın:
movie.h: İki üyeye sahip birMovieyapısı tanımla:char *title(dinamik olarak ayrılmış bir dize) veint year. Bir başlık ve yıl alancreate_movieadlı oluşturucuyu ve bir Movie işaretçisi alanfree_movieadlı yıkıcıyı tanımla.MOVIE_Hsembolüyle include guard kullan.movie.c: Her iki işlevi de uygula. Oluşturucun, yapı ve başlık dizesi için bellek ayırmalı (null sonlandırıcıyı unutma). Yıkıcın, belleği ayırma işleminin ters sırasıyla serbest bırakmalı: önce içtekititledizesini, ardından yapının kendisini. Güvenlik amacıyla yıkıcının başlangıcına bir NULL denetimi ekle.main.c: Bir film oluştur, bilgilerini görüntüle, ardından belleği düzgün şekilde temizle.
İki girdi alacaksın: film başlığı (bir dize) ve vizyon yılı (bir tam sayı).
Ana dosyanda yeni bir film oluşturmak için create_movie kullan, bilgilerini yazdır, ardından tüm belleği serbest bırakmak için free_movie çağır. Serbest bıraktıktan sonra bir onay mesajı yazdır.
Çıktıyı şu biçimde yazdır:
Movie: {title} ({year})
Memory freedÖrneğin, girdiler Inception ve 2010 olduğunda çıktı şöyle olur:
Movie: Inception (2010)
Memory freedUnutma: doğru bir yıkıcının anahtarı, belleği ters sırayla serbest bırakmaktır. Oluşturucun önce ne ayırırsa en son o serbest bırakılır; en son ne ayırırsa ilk o serbest bırakılır.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
#include "movie.h"
int main() {
char title[100];
int year;
// Girdiyi oku
scanf("%[^\n]", title);
scanf("%d", &year);
// TODO: create_movie kullanarak bir film oluştur
// TODO: Film bilgilerini şu formatta yazdır:
// Film: {title} ({year})
// TODO: free_movie kullanarak filmi serbest bırak
// TODO: "Memory freed" yazdır
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi