RAII
- C++ kursu
- Orta seviye
- Ders 86/116
- 5 dk
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
#include <iostream>
// Logger sınıfını buraya tanımla
int main() {
{
// Logger oluştur (scope içinde)
}
return 0;
}Örnek çözüm
#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?
// 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
class Logger {
public:
Logger() { std::cout << "açılıyor"; }
____Logger() { std::cout << " kapanıyor"; }
};
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.