Memori Dinamis (new/delete)
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 14 dari 104.
Sekarang setelah kamu memahami pointer dan reference, mari gunakan keduanya dengan alokasi memori dinamis. Operator new dan delete memungkinkan kamu membuat dan menghancurkan object di heap saat program berjalan.
Gunakan new untuk mengalokasikan memori dan mendapatkan pointer ke memori tersebut:
int* num = new int; // Alokasikan satu bilangan bulat
*num = 42; // Berikan nilai melalui pointer
Player* player = new Player("Hero"); // Alokasikan objectSetiap new harus memiliki delete yang sesuai untuk membebaskan memori:
delete num; // Bebaskan satu object
delete player; // Panggil destructor, lalu bebaskan memoriUntuk array, gunakan new[] dan delete[]:
int* scores = new int[5]; // Alokasikan array berisi 5 bilangan bulat
scores[0] = 100;
delete[] scores; // Bebaskan array, perhatikan tanda kurung sikunya!Kesalahan umum yang perlu dihindari:
// Kebocoran memori: lupa menggunakan delete
int* ptr = new int(10);
ptr = new int(20); // Akses ke alokasi pertama hilang!
// Pointer menggantung: digunakan setelah delete
delete ptr;
*ptr = 5; // Perilaku tidak terdefinisi!
// Penggunaan delete tidak sesuai
int* arr = new int[10];
delete arr; // Salah! Seharusnya menggunakan delete[]Setelah menghapus, atur pointer ke nullptr agar tidak digunakan kembali secara tidak sengaja. Pengelolaan memori manual rentan terhadap kesalahan, itulah sebabnya C++ modern lebih memilih smart pointer, yang akan kita bahas selanjutnya.
Tantangan
MudahMari kita buat sistem penyimpanan pesan sederhana yang menunjukkan alokasi memori dinamis dengan new dan delete.
Kamu akan membuat dua file untuk mengatur kodemu:
MessageBox.h: Definisikan classMessageBoxyang mengelola array pesan secara dinamis. Class ini harus memiliki:- Pointer privat ke array string yang dialokasikan secara dinamis
- Integer privat untuk melacak jumlah pesan saat ini
- Integer privat untuk menyimpan kapasitas maksimum
- Konstruktor yang menerima kapasitas dan mengalokasikan array menggunakan
new[] - Destruktor yang membebaskan memori dengan benar menggunakan
delete[]dan mencetak"MessageBox destroyed" - Method
addMessage(string msg)yang menambahkan pesan jika masih ada ruang, lalu mengembalikantruejika berhasil ataufalsejika penuh - Method
printAll()yang mencetak setiap pesan tersimpan pada barisnya sendiri
main.cpp: Baca nilai kapasitas dan jumlah pesan dari input. Lalu baca string pesan sebanyak jumlah tersebut. BuatMessageBoxdi heap menggunakannew, tambahkan semua pesan ke dalamnya, panggilprintAll(), lalu hapus MessageBox dengan benar untuk membebaskan memori.
Format inputnya adalah:
- Baris pertama: kapasitas (integer)
- Baris kedua: jumlah pesan yang akan ditambahkan (integer)
- Baris-baris berikutnya: satu pesan per baris
Ingat: setiap new memerlukan delete yang cocok, dan setiap new[] memerlukan delete[] yang cocok. Setelah menghapus, sebaiknya atur pointer ke nullptr.
Sertakan file header di main.cpp menggunakan #include "MessageBox.h".
Coba sendiri
#include <iostream>
#include <string>
#include "MessageBox.h"
using namespace std;
int main() {
int capacity;
int numMessages;
// Baca kapasitas dan jumlah pesan
cin >> capacity;
cin >> numMessages;
cin.ignore(); // Hapus karakter baris baru setelah angka
// TODO: Buat MessageBox di heap menggunakan new
// TODO: Baca dan tambahkan semua pesan ke MessageBox
for (int i = 0; i < numMessages; i++) {
string message;
getline(cin, message);
// Tambahkan pesan ke MessageBox
}
// TODO: Panggil printAll() untuk menampilkan semua pesan
// TODO: Hapus MessageBox untuk membebaskan memori
// Ingat untuk mengatur pointer ke nullptr setelah menghapusnya
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