Menu
Coddy logo textTech

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ı.

challenge icon

Görev

Kolay

Hem 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 bir Movie yapısı tanımla: char *title (dinamik olarak ayrılmış bir dize) ve int year. Bir başlık ve yıl alan create_movie adlı oluşturucuyu ve bir Movie işaretçisi alan free_movie adlı yıkıcıyı tanımla. MOVIE_H sembolü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çteki title dizesini, 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 freed

Unutma: 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;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C derleyicisi