Menguasai Memori Dinamis C++: Stack vs. Heap Dijelaskan
Pemahaman yang baik tentang cara kerja memori dinamis dalam C++ adalah kunci untuk menjadi programmer C++ yang baik. Memori dalam program C++ Anda dibagi menjadi dua bagian minus–
Stack minus– Semua variabel yang dideklarasikan di dalam fungsi akan mengambil memori dari stack.
Heap minus– Ini adalah memori yang tidak digunakan dari program dan dapat digunakan untuk mengalokasikan memori secara dinamis saat program berjalan.
Banyak kali, Anda tidak mengetahui sebelumnya seberapa banyak memori yang akan Anda butuhkan untuk menyimpan informasi tertentu dalam variabel yang didefinisikan dan ukuran memori yang diperlukan dapat ditentukan pada waktu runtime.
Anda dapat mengalokasikan memori pada waktu runtime di dalam heap untuk variabel dari tipe tertentu menggunakan operator khusus dalam C++ yang mengembalikan alamat ruang yang dialokasikan. Operator ini disebut operator new.
Jika Anda tidak lagi membutuhkan memori yang dialokasikan secara dinamis, Anda dapat menggunakan operator delete, yang membebaskan memori yang sebelumnya dialokasikan oleh operator new.
Operator new dan delete
Ada sintaks generik berikut untuk menggunakan operator new untuk mengalokasikan memori secara dinamis untuk tipe data apa pun.
new tipe-data;
Di sini, tipe-data dapat berupa tipe data bawaan apa pun termasuk array atau tipe data yang ditentukan pengguna lainnya termasuk kelas atau struktur. Mari kita mulai dengan tipe data bawaan. Contohnya kita dapat mendefinisikan pointer ke tipe double dan kemudian meminta agar memori dialokasikan pada waktu eksekusi. Kita dapat melakukan ini menggunakan operator new dengan pernyataan berikut minus–
double* pvalue = NULL; // Pointer diinisialisasi dengan null pvalue = new double; // Minta memori untuk variabel
Memori mungkin tidak dialokasikan dengan sukses, jika free store telah habis. Jadi merupakan praktik yang baik untuk memeriksa apakah operator new mengembalikan pointer NULL dan mengambil tindakan yang sesuai seperti di bawah minus–
double* pvalue = NULL; if( !(pvalue = new double )) { cout << "Error: kehabisan memori." <<endl; exit(1); }
Fungsi malloc() dari C, masih ada dalam C++, tetapi disarankan untuk menghindari penggunaan fungsi malloc(). Keuntungan utama new dibandingkan malloc() adalah new tidak hanya mengalokasikan memori, ia juga membangun objek yang merupakan tujuan utama C++.
Pada titik mana pun, saat Anda merasa variabel yang telah dialokasikan secara dinamis tidak lagi diperlukan, Anda dapat membebaskan memori yang dihampiri di free store dengan operator ‘delete’ sebagai berikut minus–
delete pvalue; // Bebaskan memori yang ditunjuk oleh pvalue
Mari kita gabungkan konsep di atas dan bentuk contoh berikut untuk menunjukkan bagaimana ‘new’ dan ‘delete’ bekerja minus–
Live Demo
#include <iostream> using namespace std; int main () { double* pvalue = NULL; // Pointer diinisialisasi dengan null pvalue = new double; // Minta memori untuk variabel *pvalue = 29494.99; // Simpan nilai di alamat yang dialokasikan cout << "Nilai pvalue : " << *pvalue << endl; delete pvalue; // buka memori. return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Nilai pvalue : 29495
Alokasi Memori Dinamis untuk Array
Pertimbangkan Anda ingin mengalokasikan memori untuk array karakter, yaitu string 20 karakter. Dengan sintaks yang sama seperti yang telah kita gunakan di atas kita dapat mengalokasikan memori secara dinamis seperti ditunjukkan di bawah.
char* pvalue = NULL; // Pointer diinisialisasi dengan null pvalue = new char[20]; // Minta memori untuk variabel
Untuk menghapus array yang baru saja kita buat pernyataan akan terlihat seperti ini minus–
delete [] pvalue; // Hapus array yang ditunjuk oleh pvalue
Mengikuti sintaks generik yang sama dari operator new, Anda dapat mengalokasikan untuk array multidimensi sebagai berikut minus–
double** pvalue = NULL; // Pointer diinisialisasi dengan null pvalue = new double [3][4]; // Alokasi memori untuk array 3x4
Namun, sintaks untuk membebaskan memori untuk array multidimensi akan tetap sama seperti di atas minus–
delete [] pvalue; // Hapus array yang ditunjuk oleh pvalue
Alokasi Memori Dinamis untuk Objek
Objek tidak berbeda dari tipe data sederhana. Contohnya, pertimbangkan kode berikut di mana kita akan menggunakan array objek untuk menjelaskan konsep minus–
Live Demo #include <iostream> using namespace std; class Box { public: Box() { cout << "Constructor called!" <<endl; } ~Box() { cout << "Destructor called!" <<endl; } }; int main() { Box* myBoxArray = new Box[4]; delete [] myBoxArray; // Hapus array return 0; }
Jika Anda akan mengalokasikan array empat objek Box, Konstruktor Sederhana akan dipanggil empat kali dan saat menghapus objek ini, destruktor juga akan dipanggil sebanyak kali yang sama.
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Constructor called! Constructor called! Constructor called! Constructor called! Destructor called! Destructor called! Destructor called! Destructor called!