Stack ve Heap Bellek
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 12 / 104.
C++ programları iki ana bellek bölgesi kullanır: stack ve heap. Nesnelerinizin nerede yaşadığını anlamak, verimli ve hatasız kod yazmak için çok önemlidir.
Stack hızlı, otomatik bir bellektir. Fonksiyonların içinde tanımlanan değişkenler burada yaşar ve kapsam dışına çıktıklarında otomatik olarak yok edilirler.
void example() {
int x = 10; // Stack bellek tahsisi
Player player; // Stack bellek tahsisi - otomatik olarak yok edilir
} // x ve player burada yok edilirHeap, manuel olarak yönettiğiniz daha büyük ancak daha yavaş bir bellektir. Heap üzerindeki nesneler, siz onları açıkça silene kadar kalıcı olur.
void example() {
Player* player = new Player(); // Heap bellek tahsisi
// player silinene kadar var olmaya devam eder
delete player; // Manuel temizleme gereklidir
}Temel farklar:
| Stack | Heap |
|---|---|
| Hızlı bellek ayırma | Daha yavaş bellek ayırma |
| Sınırlı boyut | Geniş kapasite |
| Otomatik temizleme | Manuel temizleme gerekir |
| Sabit boyutlu nesneler | Dinamik boyutlu nesneler |
Küçük, kısa ömürlü nesneler için stack allocation kullanın. Nesnelerin kapsamlarından (scope) daha uzun yaşaması gerektiğinde veya boyutları çalışma zamanında (runtime) belirlendiğinde heap allocation kullanın.
Heap belleği silmeyi unutmak, C++ programlarında yaygın bir hata kaynağı olan bellek sızıntılarına (memory leaks) neden olur.
Görev
KolayNesnelerin nasıl oluşturulduğunu ve yok edildiğini takip eden basit bir Counter sınıfı oluşturarak yığın (stack) ve öbek (heap) bellek arasındaki farkı keşfedelim.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
Counter.h: Özel birnameözniteliğine (string) sahip birCountersınıfı tanımlayın. Bir isim alan ve"Creating: <name>"yazdıran bir yapıcı (constructor) ile"Destroying: <name>"yazdıran bir yıkıcı (destructor) ekleyin. Sayacın ismini döndürmek için birgetName()metodu ekleyin.main.cpp: Hem yığın hem de öbek tahsisini (allocation) gösterin. Girişten bir isim okuyun, ardından:- Bu ismi kullanarak yığın üzerinde tahsis edilmiş (stack-allocated) bir
Counteroluşturun "HeapCounter"ismiyle öbek üzerinde tahsis edilmiş (heap-allocated) birCounteroluşturun- Her iki sayaç ismini
"Stack: <name>"ve"Heap: <name>"formatında yazdırın - Bellek sızıntısını önlemek için öbek üzerinde tahsis edilen sayacı silin (delete)
- Bu ismi kullanarak yığın üzerinde tahsis edilmiş (stack-allocated) bir
Her bir nesneyi ne zaman oluşturup sildiğinize bağlı olarak yapıcı ve yıkıcı mesajlarının nasıl farklı sıralarda göründüğüne dikkat edin. Yığın nesnesi main() sona erdiğinde otomatik olarak yok edilecek, öbek nesnesi ise açıkça silinmelidir.
Başlık dosyanızı main.cpp içine #include "Counter.h" kullanarak dahil edin.
Kopya kağıdı
C++ programları iki ana bellek bölgesini kullanır: yığın (stack) ve öbek (heap).
Yığın (stack) hızlı ve otomatik bir bellektir. Fonksiyonların içinde tanımlanan değişkenler burada yaşar ve kapsam dışına çıktıklarında otomatik olarak yok edilirler:
void example() {
int x = 10; // Stack allocation
Player player; // Stack allocation - destroyed automatically
} // x and player are destroyed hereÖbek (heap) daha büyük ancak manuel olarak yönettiğiniz daha yavaş bir bellektir. Öbek üzerindeki nesneler, siz onları açıkça silene kadar varlıklarını sürdürürler:
void example() {
Player* player = new Player(); // Heap allocation
// player exists until deleted
delete player; // Manual cleanup required
}Temel farklar:
| Yığın (Stack) | Öbek (Heap) |
|---|---|
| Hızlı tahsis | Daha yavaş tahsis |
| Sınırlı boyut | Büyük kapasite |
| Otomatik temizleme | Manuel temizleme gerekir |
| Sabit boyutlu nesneler | Dinamik boyutlu nesneler |
Küçük ve kısa ömürlü nesneler için yığın tahsisini kullanın. Nesnelerin kapsamlarından daha uzun süre yaşaması gerektiğinde veya boyutları çalışma zamanında belirlendiğinde öbek tahsisini kullanın. Öbek belleğini silmeyi unutmak bellek sızıntılarına (memory leaks) neden olur.
Kendin dene
#include <iostream>
#include <string>
#include "Counter.h"
using namespace std;
int main() {
// Girdiden ismi oku
string inputName;
cin >> inputName;
// TODO: inputName kullanarak yığın (stack) üzerinde tahsis edilmiş bir Counter oluşturun
// TODO: "HeapCounter" ismiyle öbek (heap) üzerinde tahsis edilmiş bir Counter oluşturun
// TODO: Yığın sayacı ismini "Stack: <name>" formatında yazdırın
// TODO: Öbek sayacı ismini "Heap: <name>" formatında yazdırın
// TODO: Bellek sızıntısını önlemek için öbek üzerinde tahsis edilen sayacı silin
return 0;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner