RAII ve exception
- C++ kursu
- İleri seviye
- Ders 75/83
- 5 dk
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
#include <iostream>
#include <string>
// FileGuard sınıfını RAII ile yaz
int main() {
// FileGuard oluştur
return 0;
}Örnek çözüm
#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
class FileGuard { public: ____FileGuard() { /* kapat */ } };
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ı |