C ++ Memori Dinamis
Pemahaman yang baik tentang bagaimana memori dinamis benar-benar bekerja di C ++ sangat penting untuk menjadi programmer C ++ yang baik. Memori dalam program C ++ Anda dibagi menjadi dua bagian -
The stack - Semua variabel yang dideklarasikan di dalam fungsi akan mengambil memori dari stack.
The heap - Ini adalah memori program yang tidak terpakai dan dapat digunakan untuk mengalokasikan memori secara dinamis saat program berjalan.
Seringkali, Anda tidak mengetahui sebelumnya berapa banyak memori yang Anda perlukan untuk menyimpan informasi tertentu dalam variabel yang ditentukan dan ukuran memori yang diperlukan dapat ditentukan pada waktu berjalan.
Anda dapat mengalokasikan memori pada waktu proses dalam heap untuk variabel jenis tertentu menggunakan operator khusus di C ++ yang mengembalikan alamat ruang yang dialokasikan. Operator ini disebutnew operator.
Jika Anda tidak lagi membutuhkan memori yang dialokasikan secara dinamis, Anda dapat menggunakan delete operator, yang tidak mengalokasikan memori yang sebelumnya dialokasikan oleh operator baru.
baru dan hapus Operator
Ada mengikuti sintaks umum untuk digunakan new operator untuk mengalokasikan memori secara dinamis untuk semua tipe data.
new data-type;
Sini, data-typedapat berupa tipe data built-in termasuk array atau tipe data yang ditentukan pengguna termasuk kelas atau struktur. Mari kita mulai dengan tipe data bawaan. Misalnya kita dapat mendefinisikan pointer untuk mengetik double dan kemudian meminta memori dialokasikan pada waktu eksekusi. Kami dapat melakukan ini menggunakannew operator dengan pernyataan berikut -
double* pvalue = NULL; // Pointer initialized with null
pvalue = new double; // Request memory for the variable
Memori mungkin tidak berhasil dialokasikan, jika penyimpanan gratis telah digunakan. Jadi praktik yang baik untuk memeriksa apakah operator baru mengembalikan pointer NULL dan mengambil tindakan yang sesuai seperti di bawah ini -
double* pvalue = NULL;
if( !(pvalue = new double )) {
cout << "Error: out of memory." <<endl;
exit(1);
}
Itu malloc()fungsi dari C, masih ada di C ++, tetapi disarankan untuk menghindari penggunaan fungsi malloc (). Keuntungan utama new over malloc () adalah new tidak hanya mengalokasikan memori, ia membangun objek yang merupakan tujuan utama C ++.
Kapan pun, ketika Anda merasa variabel yang telah dialokasikan secara dinamis tidak lagi diperlukan, Anda dapat mengosongkan memori yang ditempati di penyimpanan gratis dengan operator 'hapus' sebagai berikut -
delete pvalue; // Release memory pointed to by pvalue
Mari kita letakkan konsep di atas dan bentuk contoh berikut untuk menunjukkan bagaimana 'baru' dan 'hapus' bekerja -
#include <iostream>
using namespace std;
int main () {
double* pvalue = NULL; // Pointer initialized with null
pvalue = new double; // Request memory for the variable
*pvalue = 29494.99; // Store value at allocated address
cout << "Value of pvalue : " << *pvalue << endl;
delete pvalue; // free up the memory.
return 0;
}
Jika kita mengkompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil sebagai berikut -
Value of pvalue : 29495
Alokasi Memori Dinamis untuk Array
Pertimbangkan Anda ingin mengalokasikan memori untuk array karakter, yaitu string 20 karakter. Dengan menggunakan sintaks yang sama dengan yang kita gunakan di atas, kita dapat mengalokasikan memori secara dinamis seperti yang ditunjukkan di bawah ini.
char* pvalue = NULL; // Pointer initialized with null
pvalue = new char[20]; // Request memory for the variable
Untuk menghapus array yang baru saja kita buat pernyataannya akan terlihat seperti ini -
delete [] pvalue; // Delete array pointed to by pvalue
Mengikuti sintaks umum yang serupa dari operator baru, Anda dapat mengalokasikan untuk array multi-dimensi sebagai berikut -
double** pvalue = NULL; // Pointer initialized with null
pvalue = new double [3][4]; // Allocate memory for a 3x4 array
Namun, sintaks untuk melepaskan memori untuk array multi-dimensi akan tetap sama seperti di atas -
delete [] pvalue; // Delete array pointed to by pvalue
Alokasi Memori Dinamis untuk Objek
Objek tidak berbeda dari tipe data sederhana. Misalnya, pertimbangkan kode berikut di mana kita akan menggunakan larik objek untuk memperjelas konsep -
#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; // Delete array
return 0;
}
Jika Anda mengalokasikan larik dari empat objek Box, konstruktor Simple akan dipanggil empat kali dan begitu pula saat menghapus objek ini, destruktor juga akan dipanggil dengan jumlah yang sama.
Jika kita mengkompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil sebagai berikut -
Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!