1.1 C++ Soyut Makinesi (Abstract Machine)

C++'ın gücü, donanım mimarisinden bağımsız bir Soyut Makine (Abstract Machine) tanımı yapmasından gelir. Bu model, programın davranışını donanım bazında değil, standartta tanımlanan kurallar (semantics) bazında garanti eder.

Dilin Evrimi (Evolution)

  • C++98/03: Temel Nesne Yönelimli Programlama (Object Oriented Programming - OOP) ve Şablonlar (Templates).
  • C++11/14: Modern C++'ın doğuşu. Taşıma Semantiği (Move Semantics) ve Lambda İfadeleri (Lambda Expressions).
  • C++17/20: Derleme Zamanı Programlama (Compile-time Programming) ve Kavramlar (Concepts).
  • C++23: `std::expected`, Modüller (Modules) ve Standart Kütüphane iyileştirmeleri.

Tanımsız Davranış (Undefined Behavior - UB)

Akademik düzeyde C++'da Tanımsız Davranış (Undefined Behavior), standardın hiçbir gereksinim dayatmadığı durumdur. Derleyici, UB içeren kodun asla çalışmayacağını varsayarak optimizasyon yapar. Bu durum, siber güvenlik açıklarının (Exploits) en temel kaynağıdır.

1.2 Bellek Hiyerarşisi ve Nesne Ömrü

Bir nesnenin bellekteki varlığı, onun Kapsam (Scope) ve Depolama Süresi (Storage Duration) ile doğrudan ilişkilidir.

graph LR subgraph RAM [Bellek Yerleşimi] A[Kod / Text] --- B[Veri / Data] B --- C[BSS Bölümü] C --- D[Yığın / Stack] D --- E[Öbek / Heap] end subgraph Lifetime [Yaşam Ömrü] D -->|Otomatik| F[Automatic Lifetime] E -->|Dinamik| G[Dynamic Lifetime] B -->|Statik| H[Static Lifetime] end

Akademik Derinlik: RAII ve Kaynak Yönetimi

Kaynak Edinimi Başlatmadır (Resource Acquisition Is Initialization - RAII) prensibi, C++'ın bellek yönetimindeki altın kuralıdır. Necati Ergin'in vurguladığı üzere, kaynaklar (Bellek, Dosya, Network) bir nesnenin kurucu (Constructor) fonksiyonunda edinilmeli ve yıkıcı (Destructor) fonksiyonunda iade edilmelidir. Bu, istisna (Exception) durumlarında bile kaynak sızıntısını engeller.

1.3 İleri Seviye Uygulama: C++23 Standartları

architectural_memory_safety.cpp
#include <iostream>
#include <memory>
#include <expected> // C++23 Hata Yönetimi
#include <string_view>

// Akademik Not: string_view kullanımı kopyalamayı (copy) engeller ve performansı artırır.
enum class BellekHatasi { TahsisHatasi, ErisimHatasi };

/**
 * @brief Kaynak Yönetimi ve Hata Güvenliği (Exception Safety)
 * MISRA C++:2023 Rule: Dinamik bellek yönetimi akıllı işaretçilerle yapılmalıdır.
 */
std::expected<std::unique_ptr<int>, BellekHatasi> guvenli_bellek_ayir(int deger) {
    try {
        // std::make_unique istisna güvenliği (Exception Safety) sağlar.
        return std::make_unique<int>(deger);
    } catch (...) {
        return std::unexpected(BellekHatasi::TahsisHatasi);
    }
}

int main() {
    // Otomatik Tür Çıkarımı (Type Inference)
    auto sonuc = guvenli_bellek_ayir(1024);

    if (sonuc) {
        // Dereferencing (İşaretçinin gösterdiği değere erişim)
        std::cout << "Deger: " << **sonuc << std::endl;
    } else {
        std::cerr << "Hata Oluştu!" << std::endl;
    }

    return 0; // unique_ptr kapsam dışına çıktığında bellek OTOMATİK silinir (RAII).
}

Mimarın Satır Analizi:

std::expected: C++23 ile gelmiştir. Fonksiyonun ya beklenen değeri ya da bir hata nesnesini dönmesini garanti eder. `throw` mekanizmasına göre daha performanslıdır.
unique_ptr: "Münhasır Mülkiyet" (Exclusive Ownership) kavramını simgeler. Kopyalanamaz (Move-only), bu da bellek çatışmalarını (Memory Conflicts) önler.

⚠️ Sık Yapılan Hatalar (Common Pitfalls)

01

Çıplak İşaretçi Karmaşası (Raw Pointer Confusion)

trcpp-telegram topluluğunda en sık görülen hata, `new` ile ayrılan belleğin `delete` ile silinmesinin unutulmasıdır.
Çözüm: Daima `std::unique_ptr` veya `std::shared_ptr` kullanın.

02

Dangling Reference (Sarkan Referans)

Yaşam süresi dolmuş yerel bir değişkenin adresini dönmek veya referansını saklamak. Bu durum sessizce Tanımsız Davranış (UB) tetikler.

1.5 Final Ölçme ve Değerlendirme Testi

Soru 1: Aşağıdakilerden hangisi C++ Soyut Makinesi (Abstract Machine) için doğrudur?

Soru 2: MISRA C++:2023 standartlarına göre bellek yönetiminde ne tercih edilmelidir?