Menu
Coddy logo textTech

C++'ta RAII

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 16 / 104.

RAII (Resource Acquisition Is Initialization), kaynak yönetiminin nesnenin yaşam süresine bağlandığı temel bir C++ deyimidir. Fikir basittir: kaynakları kurucuda edinmek, yıkıcıda serbest bırakmak.

Bir nesne oluşturulduğunda, ihtiyaç duyduğu tüm kaynakları edinir. Nesne kapsam dışına çıktığında, yıkıcısı bu kaynakları otomatik olarak serbest bırakır. Bu, istisnalar meydana gelse bile temizlemenin gerçekleştirilmesini garanti eder.

class FileHandler {
    std::FILE* file;
public:
    FileHandler(const char* filename) {
        file = std::fopen(filename, "r");  // Kaynağı edin
    }
    
    ~FileHandler() {
        if (file) std::fclose(file);       // Kaynağı serbest bırak
    }
};

RAII ile temizleme işlemini yapmayı asla unutmazsınız:

void processFile() {
    FileHandler handler("data.txt");  // Kaynak edinildi
    // Dosya ile çalış...
    // Eğer burada istisna fırlatılırsa, yıkıcı yine de çalışır!
}   // Kaynak otomatik olarak serbest bırakıldı

Akıllı işaretçiler, RAII'nin iş başındaki mükemmel örneğidir. Bir unique_ptr, kurucusunda öbek belleğinin sahipliğini edinir ve yıkıcısında onu siler. Farkında olmadan zaten RAII kullanıyordun!

RAII herhangi bir kaynağa uygulanabilir: belleğe, dosya tanıtıcılarına, ağ bağlantılarına, mutex'lere veya veritabanı bağlantılarına. C++, kaynakları nesneler içinde sararak deterministik temizlemeyi garanti eder ve sızıntılar ile geçersiz tanıtıcılar gibi hata kategorilerini tamamen ortadan kaldırır.

challenge icon

Görev

Kolay

Ağ benzeri bağlantıların yaşam döngüsünü otomatik olarak yöneterek RAII'yi gösteren bir bağlantı yöneticisi oluşturalım. Bir bağlantı oluşturulduğunda "açılmalı" ve kapsam dışına çıktığında otomatik olarak "kapatılmalı": elle temizleme gerekmez!

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • Connection.h: RAII ilkelerini kullanarak bir bağlantı kaynağını yöneten bir Connection sınıfı tanımlayın. Sınıf şunlara sahip olmalıdır:
    • Bağlantıyı tanımlamak için özel bir connectionId özniteliği (string)
    • Bağlantı durumunu izlemek için özel bir isOpen özniteliği (bool)
    • Bir bağlantı kimliği alan, isOpen değerini true olarak ayarlayan ve "Opening connection: <id>" yazdıran bir oluşturucu
    • Bağlantının açık olup olmadığını kontrol eden, isOpen değerini false olarak ayarlayarak bağlantıyı kapatan ve "Closing connection: <id>" yazdıran bir yıkıcı
    • Bağlantı açıksa send(string message) yazdıran bir "[<id>] Sending: <message>" yöntemi
    • Bağlantı kimliğini döndüren bir getId() yöntemi
  • main.cpp: Girdiden bir bağlantı kimliği ve ileti okuyarak RAII'nin otomatik temizlemeyi nasıl sağladığını gösterin. Ardından:
    • Süslü parantezleri kullanarak bir kapsam oluşturun { }
    • Bu kapsamın içinde, girdi kimliğiyle yığın üzerinde bir Connection nesnesi oluşturun
    • Girdi iletisini göndermek için bağlantıyı kullanın
    • Kapsamın sona ermesine izin verin (bağlantı otomatik olarak kapanmalıdır)
    • Kapsamdan sonra "Connection out of scope" yazdırın

RAII'nin güzelliği, bağlantıyı kapatmayı hatırlamanız gerekmemesidir: nesne kapsamdan çıktığında yıkıcı bunu otomatik olarak gerçekleştirir. Bu kalıp, kodunuzda beklenmedik bir şey olsa bile kaynak sızıntılarını önler.

Üstbilgi dosyanızı #include "Connection.h" kullanarak main.cpp içine ekleyin.

Kendin dene

#include <iostream>
#include <string>
#include "Connection.h"

using namespace std;

int main() {
    string connectionId;
    string message;
    
    // Girdiyi oku
    cin >> connectionId;
    cin.ignore();
    getline(cin, message);

    // TODO: Süslü parantezler { } kullanarak bir kapsam oluştur
    // Kapsamın içinde:
    //   - connectionId ile yığında bir Connection nesnesi oluştur
    //   - Mesajı göndermek için bağlantıyı kullan
    // Kapsamın sona ermesine izin ver (yıkıcı otomatik olarak çağrılacak)

    // TODO: After the scope ends, print "Connection out of scope"

    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi