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.
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ı
#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:
⚠️ Sık Yapılan Hatalar (Common Pitfalls)
Çı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.
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?