CodeBlanks Logo Icon CodeBlanks

RAII

RAII deseniyle kaynak yönetimini öğrenirsin.

RAII

RAII (Resource Acquisition Is Initialization), kaynak ediniminin başlatma olduğu bir desendir. Kaynak (bellek, dosya, soket) bir nesnenin yapıcısında alınır, yıkıcısında bırakılır. Nesne scope'tan çıkınca yıkıcı otomatik çalışır.

Akıllı işaretçiler RAII'nin en bilinen örneğidir: unique_ptr yapıcısında new, yıkıcısında delete yapar. Sen kendi RAII sınıflarını da yazabilirsin. Örneğin bir Logger sınıfının yapıcısı "açılıyor", yıkıcısı "kapanıyor" yazdırır. Bu desen, istisna olsa bile kaynağın serbest bırakılmasını garanti eder; çünkü yıkıcı her durumda çalışır.

Scope guard

RAII'nin gücü, scope guard kavramında yatar. Bir nesne bir scope içinde oluşturulduğunda, scope sonunda yıkıcı otomatik çalışır. Bu, try/finally veya manuel temizlik yazmaya gerek bırakmaz.

Örnek: { Logger log; ... } bloğunda log oluşur, blok sonunda yıkıcısı çalışır. İçeride istisna fırlatsa bile yıkıcı çalışır; çünkü C++ yığın açma (stack unwinding) sırasında tüm yerel nesnelerin yıkıcılarını çağırır. Bu, C++'ın bellek güvenliği ve kaynak yönetimi için temel bir mekanizmasıdır. Akıllı işaretçiler, kapsüller ve STL kapsayıcıları hep RAII kullanır.

Uygulama RAII Logger sınıfı yaz

Logger adında bir sınıf tanımla. Yapıcı metot std::cout << "açılıyor"; yazsın. Yıkıcı metot (~Logger()) std::cout << " kapanıyor"; yazsın. main içinde bir { } bloğunda Logger log; oluştur; blok bitince yıkıcı çalışır.

Başlangıç kodu

main.cpp
#include <iostream>

// Logger sınıfını buraya tanımla

int main() {
    {
        // Logger oluştur (scope içinde)
    }
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Logger {
public:
    Logger() { std::cout << "açılıyor"; }
    ~Logger() { std::cout << " kapanıyor"; }
};

int main() {
    {
        Logger log;
    }
    return 0;
}

Beklenen çıktı

açılıyor kapanıyor

Soru ve cevaplar

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

1 Parçayı rolüne eşle

Kavram Anlamı
Yapıcı (constructor) Kaynak al
Yıkıcı (destructor) Kaynak bırak
Scope sonu Yıkıcı çalışır
unique_ptr RAII örneği

2 RAII neyin kısaltmasıdır?

main.cpp
// modern C++ kaynak yönetimi deseni
  • Random Access Integer Index
  • Recursive Algorithm Implementation
  • Rapid Application Integration
  • Resource Acquisition Is Initialization Doğru cevap

Açıklama: RAII 'Resource Acquisition Is Initialization' demektir.

3 Yıkıcıyı tanımla

Soru
class Logger {
public:
    Logger() { std::cout << "açılıyor"; }
    ____Logger() { std::cout << " kapanıyor"; }
};
Cevap
class Logger {
public:
    Logger() { std::cout << "açılıyor"; }
    ~Logger() { std::cout << " kapanıyor"; }
};

Açıklama: ~ yazılır: ~Logger() ile yıkıcı tanımlanır.

Orta seviye bölümündeki tüm dersler