C++
Exception safety
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Garantiyi açıklamasıyla eşle
- basic
- Geçerli durum
- strong
- Rollback
- nothrow
- Asla fırlatmaz
- swap
- Nothrow takas
-
nothrow takas
v.____(copy);
Cevabı göster
v.swap(copy);
-
Strong guarantee hangi senaryoda sağlanır?
- Fonksiyon hiç istisna fırlatmadığında
- İstisna durumunda nesne olduğu gibi kaldığında (rollback)
- Nesne her durumda bozulduğunda
- İstisna yutulduğunda
Cevabı göster
İstisna durumunda nesne olduğu gibi kaldığında (rollback) — Strong guarantee: işlem ya tamamlanır ya da nesne rollback ile olduğu gibi kalır.
Sıradaki ders: RAII ve exception