Menu
CoddyTech

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 object

Setiap new harus memiliki delete yang sesuai untuk membebaskan memori:

delete num;      // Bebaskan satu object
delete player;   // Panggil destructor, lalu bebaskan memori

Untuk 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.

challenge icon

Tantangan

Mudah

Mari 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 class MessageBox yang 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 mengembalikan true jika berhasil atau false jika 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. Buat MessageBox di heap menggunakan new, tambahkan semua pesan ke dalamnya, panggil printAll(), 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online