Exception safety
- C++ kursu
- İleri seviye
- Ders 74/83
- 5 dk
Exception safety garantileri öğrenirsin.
Exception safety garantileri
Bir fonksiyonun exception safety garantisi, istisna fırlatıldığında programın durumunu nasıl koruduğunu anlatır. Üç temel garanti vardır: basic (temel), strong (güçlü) ve nothrow (istisna fırlatmaz).
Basic guarantee: istisna sonrası nesne geçerli bir durumda kalır, kaynak sızıntısı olmaz. Strong guarantee: işlem ya tamamlanır ya da nesne olduğu gibi kalır (rollback). Nothrow guarantee: fonksiyon asla istisna fırlatmaz; yıkıcılar ve swap böyledir. Bu üçlü, sağlam kod tasarımının iskeletini oluşturur.
Strong guarantee: copy-and-swap
Strong guarantee sağlamanın klasik yolu copy-and-swap tekniğidir: önce nesnenin bir kopyasını al, kopya üzerinde değişikliği yap, sonra swap ile takas et.
Örnek: void add_item(vector<string>& v, const string& item) { vector<string> copy = v; copy.push_back(item); v.swap(copy); }. push_back bellek dolunca istisna fırlatabilir; bu durumda v dokunulmamıştır. swap nothrow'dur, bu yüzden son adımda hata olmaz. Böylece ya ekleme tamamlanır ya da v olduğu gibi kalır.
Uygulama Strong guarantee ile add_item yaz
add_item fonksiyonunu copy-and-swap ile yaz: std::vector<std::string> copy = v;, copy.push_back(item);, v.swap(copy);. main içinde std::vector<std::string> v{"a", "b"}; oluştur, add_item(v, "c") çağır ve v.size()'ı yazdır.
Başlangıç kodu
#include <iostream>
#include <vector>
#include <string>
// add_item fonksiyonunu copy-and-swap ile yaz
int main() {
// vektör oluştur, çağır ve boyutu yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <vector>
#include <string>
void add_item(std::vector<std::string>& v, const std::string& item) {
std::vector<std::string> copy = v;
copy.push_back(item);
v.swap(copy);
}
int main() {
std::vector<std::string> v{"a", "b"};
add_item(v, "c");
std::cout << v.size();
return 0;
}Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Garantiyi açıklamasıyla eşle
| Kavram | Anlamı |
|---|---|
basic |
Geçerli durum |
strong |
Rollback |
nothrow |
Asla fırlatmaz |
swap |
Nothrow takas |
2 nothrow takas
v.____(copy);
v.swap(copy);
Açıklama: swap nothrow'dur ve strong guarantee'nin son adımıdır.
3 Strong guarantee hangi senaryoda sağlanır?
- Fonksiyon hiç istisna fırlatmadığında
- İstisna durumunda nesne olduğu gibi kaldığında (rollback) Doğru cevap
- Nesne her durumda bozulduğunda
- İstisna yutulduğunda
Açıklama: Strong guarantee: işlem ya tamamlanır ya da nesne rollback ile olduğu gibi kalır.