Memori Stack vs Heap
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 12 dari 104.
Program C++ menggunakan dua area memori utama: stack dan heap. Memahami di mana object-mu berada sangat penting untuk menulis kode yang efisien dan bebas bug.
stack adalah memori yang cepat dan otomatis. Variabel yang dideklarasikan di dalam fungsi disimpan di sini dan otomatis dihapus saat keluar dari cakupannya.
void example() {
int x = 10; // Alokasi di stack
Player player; // Alokasi di stack, dihancurkan secara otomatis
} // x dan player dihancurkan di siniheap adalah memori yang lebih besar tetapi lebih lambat, yang kamu kelola secara manual. Object di heap tetap ada sampai kamu menghapusnya secara eksplisit.
void example() {
Player* player = new Player(); // Alokasi memori di heap
// player tetap ada hingga dihapus
delete player; // Perlu dibersihkan secara manual
}Perbedaan utama:
| Stack | Heap |
|---|---|
| Alokasi cepat | Alokasi lebih lambat |
| Ukuran terbatas | Kapasitas besar |
| Pembersihan otomatis | Perlu pembersihan manual |
| Object berukuran tetap | Object berukuran dinamis |
Gunakan alokasi stack untuk object kecil yang berumur pendek. Gunakan alokasi heap saat object perlu bertahan lebih lama daripada cakupannya atau saat ukurannya ditentukan saat runtime.
Lupa menghapus memori heap menyebabkan kebocoran memori, sumber bug yang umum dalam program C++.
Tantangan
MudahMari kita pelajari perbedaan antara memori stack dan heap dengan membuat class Counter sederhana yang melacak kapan object dibuat dan dihancurkan.
Kamu akan membuat dua file untuk mengatur kodemu:
Counter.h: Definisikan classCounterdengan atributnameprivat (string). Sertakan constructor yang menerima name dan mencetak"Creating: <name>", serta destructor yang mencetak"Destroying: <name>". Tambahkan methodgetName()untuk mengembalikan name counter.main.cpp: Tunjukkan alokasi di stack dan heap. Baca name dari input, lalu:- Buat
Counteryang dialokasikan di stack dengan name tersebut - Buat
Counteryang dialokasikan di heap dengan name"HeapCounter" - Cetak kedua name counter dengan format
"Stack: <name>"dan"Heap: <name>" - Hapus counter yang dialokasikan di heap untuk mencegah kebocoran memori
- Buat
Perhatikan urutan kemunculan pesan constructor dan destructor yang berbeda, bergantung pada kapan kamu membuat dan menghapus setiap object. Object di stack akan dihancurkan secara otomatis saat main() berakhir, sedangkan object di heap harus dihapus secara eksplisit.
Sertakan file header-mu di main.cpp menggunakan #include "Counter.h".
Coba sendiri
#include <iostream>
#include <string>
#include "Counter.h"
using namespace std;
int main() {
// Baca nama dari input
string inputName;
cin >> inputName;
// TODO: Buat Counter yang dialokasikan di stack menggunakan inputName
// TODO: Buat Counter yang dialokasikan di heap dengan nama "HeapCounter"
// TODO: Cetak nama counter di stack dengan format "Stack: <name>"
// TODO: Cetak nama counter di heap dengan format "Heap: <name>"
// TODO: Hapus counter yang dialokasikan di heap untuk mencegah kebocoran memori
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online