C++
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Yıkıcı temizlik
class FileGuard { public: ____FileGuard() { /* kapat */ } };
Cevabı göster
class FileGuard { public: ~FileGuard() { /* kapat */ } };
-
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
- Çoklu iş parçacığını destekler
Cevabı göster
İstisna fırlatsa bile kaynağı otomatik bırakır — RAII'de yıkıcı, istisna fırlatsa bile stack unwinding ile çağrılır.
-
Parçayı rolüne eşle
- constructor
- Kaynak alır
- destructor
- Kaynak bırakır
- stack unwinding
- Yıkıcıları çağırır
- FileGuard
- Dosya sarmalayıcı
Sıradaki ders: std::expected