C++
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.
Örnek çözümü göster
#include <iostream>
class Logger {
public:
Logger() { std::cout << "açılıyor"; }
~Logger() { std::cout << " kapanıyor"; }
};
int main() {
{
Logger log;
}
return 0;
}
Kendini test et
-
Parçayı rolüne eşle
- Yapıcı (constructor)
- Kaynak al
- Yıkıcı (destructor)
- Kaynak bırak
- Scope sonu
- Yıkıcı çalışır
- unique_ptr
- RAII örneği
-
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
Cevabı göster
Resource Acquisition Is Initialization — RAII 'Resource Acquisition Is Initialization' demektir.
-
Yıkıcıyı tanımla
class Logger {
public:
Logger() { std::cout << "açılıyor"; }
____Logger() { std::cout << " kapanıyor"; }
};
Cevabı göster
class Logger {
public:
Logger() { std::cout << "açılıyor"; }
~Logger() { std::cout << " kapanıyor"; }
};
Sıradaki ders: Özet - Akıllı işaretçiler