CodeBlanks Logo Icon CodeBlanks

RAII ve exception

RAII ile exception güvenli kaynak yönetimini öğrenirsin.

RAII nedir?

RAII (Resource Acquisition Is Initialization), bir kaynağın yaşam döngüsünü bir nesnenin yaşam döngüsüne bağlar. Kaynak kurucuda alınır, yıkıcıda bırakılır. İstisna fırlatılsa bile yıkıcı otomatik çalışır.

Örnek: bir dosya açan FileGuard sınıfı. Kurucu dosyayı açar, yıkıcı kapatır. Fonksiyon istisna fırlatsa bile stack unwinding ile yıkıcı çağrılır ve dosya kapanır. Bu, elle close çağırmaya göre çok daha güvenlidir. C++'ta std::vector, std::string, akıllı işaretçiler hep RAII ile yazılmıştır.

Stack unwinding

Bir istisna fırlatıldığında, stack unwinding başlar: çağrı yığınındaki her fonksiyon için, kapsam dışına çıkan yerel nesnelerin yıkıcıları çağrılır. Bu, catch bloğuna ulaşana kadar sürer.

RAII ile yazılmış nesneler bu süreçte otomatik temizlenir. Örnek: bir fonksiyon FileGuard f("a.txt"); oluşturup sonra istisna fırlatırsa, f'nin yıkıcı unwinding sırasında çağrılır ve dosya kapanır. Elle finally bloğu yazmaya gerek yoktur. Bu yüzden C++'ta finally yoktur; RAII onun yerini alır.

Uygulama FileGuard RAII sınıfı yaz

FileGuard sınıfını yaz: kurucu std::string alsın ve std::cout << "aç: " << name_ << "\n"; yazsın; yıkıcı std::cout << "kapat: " << name_; yazsın. main içinde FileGuard f("veri.txt"); oluştur.

Başlangıç kodu

main.cpp
#include <iostream>
#include <string>

// FileGuard sınıfını RAII ile yaz

int main() {
    // FileGuard oluştur
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <string>

class FileGuard {
    std::string name_;
public:
    explicit FileGuard(const std::string& n) : name_(n) {
        std::cout << "aç: " << name_ << "\n";
    }
    ~FileGuard() {
        std::cout << "kapat: " << name_;
    }
};

int main() {
    FileGuard f("veri.txt");
    return 0;
}

Beklenen çıktı

aç: veri.txt
kapat: veri.txt

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Yıkıcı temizlik

Soru
class FileGuard { public: ____FileGuard() { /* kapat */ } };
Cevap
class FileGuard { public: ~FileGuard() { /* kapat */ } };

Açıklama: Yıkıcı ~ ile başlar ve kaynağı serbest bırakır.

2 RAII'nin istisna güvenliğindeki avantajı nedir?

  • Kodu daha hızlı yapar
  • Daha az bellek kullanır
  • İstisna fırlatsa bile kaynağı otomatik bırakır Doğru cevap
  • Çoklu iş parçacığını destekler

Açıklama: RAII'de yıkıcı, istisna fırlatsa bile stack unwinding ile çağrılır.

3 Parçayı rolüne eşle

Kavram Anlamı
constructor Kaynak alır
destructor Kaynak bırakır
stack unwinding Yıkıcıları çağırır
FileGuard Dosya sarmalayıcı

İleri seviye bölümündeki tüm dersler