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 memory bölgesi kullanır: yığın ve heap. Nesnelerinizin nerede yaşadığını anlamak, verimli ve hatasız kod yazmak için çok önemlidir.
yığın hızlı, otomatik memory'dir. İşlevlerin içinde bildirilen değişkenler burada yaşar ve kapsam dışına çıktıklarında automatically destroyed olur.
void example() {
int x = 10; // Yığın tahsisi
Player player; // Yığın tahsisi - otomatik olarak yok edilir
} // x ve player burada yok edilirheap, daha büyük ancak daha yavaş bir memory'dir ve bunu elle yönetirsin. heap üzerindeki nesneler, onları açıkça delete edene kadar varlığını sürdürür.
void example() {
Player* player = new Player(); // Heap tahsisi
// player silinene kadar var olur
delete player; // Manuel temizlik gerekli
}Temel farklar:
| Yığın | Heap |
|---|---|
| Hızlı allocation | Daha yavaş allocation |
| Sınırlı boyut | Büyük kapasite |
| Otomatik cleanup | Manual cleanup gerekli |
| Sabit boyutlu nesneler | Dinamik boyutlu nesneler |
Küçük ve kısa ömürlü nesneler için yığın tahsisini kullanın. Nesnelerin kapsamlarını aşması gerektiğinde veya boyutları çalışma zamanında belirlendiğinde heap tahsisini kullanın.
Heap belleğini delete etmeyi unutmak, C++ programlarındaki yaygın bir hata kaynağı olan memory leaks sorununa yol açar.
Görev
KolayNesnelerin nasıl oluşturulduğunu ve yok edildiğini izleyen basit bir Counter class oluşturarak stack ve heap memory arasındaki farkı keşfedelim.
Code'unuzu düzenlemek için iki dosya oluşturacaksınız:
Counter.h: private birnameniteliğine (string) sahip birCounterclass define edin. Bir name alan ve"Creating: <name>"yazdıran bir constructor ile"Destroying: <name>"yazdıran bir destructor include edin. Counter'ın name değerini return etmek için birgetName()method ekleyin.main.cpp: Hem stack hem de heap allocation işlemlerini gösterin. input'tan bir name okuyun, ardından:- Bu name'i kullanarak stack'te allocation edilmiş bir
Counteroluşturun "HeapCounter"name'ine sahip, heap'te allocation edilmiş birCounteroluşturun- Her iki counter name'ini
"Stack: <name>"ve"Heap: <name>"formatında Print edin - Bir memory leak'i prevent etmek için heap'te allocation edilmiş counter'ı Delete edin
- Bu name'i kullanarak stack'te allocation edilmiş bir
Her nesneyi ne zaman oluşturup Delete ettiğinize bağlı olarak constructor ve destructor mesajlarının farklı sıralarda göründüğüne dikkat edin. Stack nesnesi, main() sona erdiğinde automatically yok edilirken heap nesnesi açıkça Delete edilmelidir.
#include "Counter.h" kullanarak header file'ınızı main.cpp'ye include edin.
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 üzerinde ayrılmış bir Counter oluştur
// TODO: "HeapCounter" adıyla öbek üzerinde ayrılmış bir Counter oluştur
// TODO: Print stack counter name in format "Stack: <name>"
// TODO: Öbek sayacının adını "Heap: <name>" formatında yazdır
// TODO: Bellek sızıntısını önlemek için öbek üzerinde ayrılmış sayacı sil
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 KonteynerKendi başına pratik yap: Online C++ derleyicisi