C++ RAII Pattern: Kaynak Yönetimini Otomatik Hale Getirme
C++'ta en sık yapılan hata bellek sızıntısı. Bir kaynağı (dosya, bellek, bağlantı) açtıktan sonra kapatmayı unutmak çok kolay. RAII (Resource Acquisition Is Initialization) pattern bunu tamamen otomatik hale getirir.
RAII basit: bir nesne oluşturulurken kaynağı al, nesne yok edilirken kaynağı serbest bırak. Başka hiçbir şey yapma, C++ bunu kendisi halleder.
1#include <iostream>2#include <fstream>34class FileHandler {5private:6std::fstream file;78public:9FileHandler(const char* filename) {10file.open(filename);11if (!file.is_open()) {12throw std::runtime_error("Dosya açılamadı");13}14std::cout << "Dosya açıldı: " << filename << std::endl;15}1617~FileHandler() {18if (file.is_open()) {19file.close();20std::cout << "Dosya kapatıldı otomatik" << std::endl;21}22}2324void write(const char* data) {25file << data << std::endl;26}27};2829int main() {30{31FileHandler fh("test.txt");32fh.write("RAII ile bellek sızıntısı yok");33} // Burada otomatik olarak destructor çağrılır3435std::cout << "Program bitti" << std::endl;36return 0;37}Beklenen çıktı:
1Dosya açıldı: test.txt2Dosya kapatıldı otomatik3Program bittiGördüğün gibi blok bittikten sonra dosya kendiliğinden kapanıyor. Hiçbir yerde `delete` veya `close()` çağırmadık.
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
Gerçek dünyada `std::unique_ptr` ve `std::shared_ptr` kullan:
1#include <memory>2#include <iostream>34class Resource {5public:6Resource() { std::cout << "Kaynak oluşturuldu" << std::endl; }7~Resource() { std::cout << "Kaynak serbest bırakıldı" << std::endl; }8};910int main() {11{12std::unique_ptr<Resource> res(new Resource());13// res kendiliğinden yok edilir14}15return 0;16}Çıktı:
1Kaynak oluşturuldu2Kaynak serbest bırakıldıSık yapılan hata: Destruktoru yazmayı unutmak veya manuel silme yapmak. RAII'nin tüm amacı bunu ortadan kaldırmak, bu yüzden destruktora güven.
0 yorum