CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.cpp
#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

main.cpp
#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

Soru
v.____(copy);
Cevap
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.

İleri seviye bölümündeki tüm dersler