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>
3
4class FileHandler {
5private:
6std::fstream file;
7
8public:
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}
16
17~FileHandler() {
18if (file.is_open()) {
19file.close();
20std::cout << "Dosya kapatıldı otomatik" << std::endl;
21}
22}
23
24void write(const char* data) {
25file << data << std::endl;
26}
27};
28
29int main() {
30{
31FileHandler fh("test.txt");
32fh.write("RAII ile bellek sızıntısı yok");
33} // Burada otomatik olarak destructor çağrılır
34
35std::cout << "Program bitti" << std::endl;
36return 0;
37}

Beklenen çıktı:

1Dosya açıldı: test.txt
2Dosya kapatıldı otomatik
3Program bitti

Gö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>
3
4class Resource {
5public:
6Resource() { std::cout << "Kaynak oluşturuldu" << std::endl; }
7~Resource() { std::cout << "Kaynak serbest bırakıldı" << std::endl; }
8};
9
10int main() {
11{
12std::unique_ptr<Resource> res(new Resource());
13// res kendiliğinden yok edilir
14}
15return 0;
16}

Çıktı:

1Kaynak oluşturuldu
2Kaynak 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz