Menguasai Manajemen Memori C++: Penggunaan Ahli new dan delete
Menguasai Manajemen Memori C++: Penggunaan Ahli new dan delete
Panduan ini menjelaskan cara mengalokasi dan membebaskan memori heap dalam C++ dengan new dan delete, diilustrasikan melalui contoh-contoh dunia nyata yang jelas.
C++ memberi pengembang kekuatan untuk mengalokasikan memori pada waktu runtime—disebut alokasi memori dinamis. Berbeda dengan bahasa terkelola seperti Java atau Python, C++ tidak secara otomatis mereclaim memori heap; programmer harus secara eksplisit membebaskannya.
Menggunakan operator new dan delete menyediakan mekanisme dasar untuk tugas ini. Operator ini adalah dasar manajemen memori manual dalam C++ dan didefinisikan dalam pustaka standar C++.
Operator new
Operator new mengalokasikan blok memori di heap dan mengembalikan pointer ke byte pertamanya. Misalnya:
// deklarasikan pointer int int* pointVar; // alokasikan memori secara dinamis menggunakan new pointVar = new int; // tetapkan nilai ke memori yang dialokasi *pointVar = 45;
Dalam cuplikan ini, pointVar menerima alamat dari int yang baru dialokasi. Karena new mengembalikan pointer, variabel harus bertipe pointer. Untuk array, new mengembalikan pointer ke elemen pertama:
int* arr = new int[10]; // arr menunjuk ke elemen pertama dari array 10 int
Sintaks umum adalah:
pointerVariable = new dataType; // objek tunggal pointerVariable = new dataType[size]; // array
Operator delete
Ketika objek atau array yang dialokasi dengan new tidak lagi diperlukan, delete harus dipanggil untuk melepaskan memori kembali ke sistem operasi. Gagal melakukannya menghasilkan kebocoran memori yang dapat menurunkan kinerja atau menyebabkan aplikasi crash.
Untuk objek tunggal:
delete pointerVariable;
Untuk array yang dialokasi dengan new[], gunakan bentuk array:
delete[] pointerVariable;
Contoh siklus hidup lengkap:
// alokasikan int int* pointVar = new int; *pointVar = 45; cout << *pointVar; // Output: 45 // dealokasi delete pointVar;
Tips: Pasangkan setiap new dengan delete yang sesuai (atau delete[] untuk array). Gunakan RAII atau smart pointer (misalnya, std::unique_ptr) untuk mengotomatisasi proses ini dalam kode produksi.
Contoh 1: Alokasi Dinamis Dasar
#include <iostream> using namespace std; int main() { int* pointInt; float* pointFloat; pointInt = new int; pointFloat = new float; *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; delete pointInt; delete pointFloat; return 0; }
Output
45 45.45
Program ini menunjukkan alokasi dua tipe primitif, penugasan, output, dan dealokasi yang bersih.
Catatan: Alokasi dinamis dapat meningkatkan fleksibilitas, terutama ketika ukuran ditentukan pada waktu runtime.
Contoh 2: Alokasi Array Float
#include <iostream> using namespace std; int main() { int num; cout << "Masukkan total jumlah siswa: "; cin >> num; float* ptr = new float[num]; cout << "Masukkan IPK siswa." << endl; for (int i = 0; i < num; ++i) { cout << "Siswa" << i + 1 << ": "; cin >> *(ptr + i); } cout << "\nMenampilkan IPK siswa." << endl; for (int i = 0; i < num; ++i) { cout << "Siswa" << i + 1 << " :" << *(ptr + i) << endl; } delete[] ptr; return 0; }
Output
Masukkan total jumlah siswa: 4 Masukkan IPK siswa. Siswa1: 3.6 Siswa2: 3.1 Siswa3: 3.9 Siswa4: 2.9 Menampilkan IPK siswa. Siswa1 :3.6 Siswa2 :3.1 Siswa3 :3.9 Siswa4 :2.9
Program meminta pengguna untuk jumlah siswa, mengalokasikan array float sesuai dengan itu, mengumpulkan input, menampilkan data, dan akhirnya membebaskan memori dengan delete[].
Contoh 3: Alokasi Dinamis Objek
#include <iostream> using namespace std; class Student { int age; public: Student() : age(12) {} void getAge() { cout << "Usia = " << age << endl; } }; int main() { Student* ptr = new Student(); ptr->getAge(); delete ptr; return 0; }
Output
Usia = 12
Contoh ini membuat objek Student di heap. Konstruktor menginisialisasi age ke 12, dan metode getAge mencetaknya. Setelah digunakan, delete melepaskan memori objek.