Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Bahasa C

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–

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! 

Bahasa C

  1. Memahami Tipe Data C++: Dasar, Modifikasi, dan Praktik Terbaik
  2. Menguasai Operator C++: Panduan Lengkap dengan Contoh Praktis
  3. Komentar C++: Praktik Terbaik untuk Kode yang Mudah Dibaca dan Dipelihara
  4. Manajemen Memori Dinamis dalam C: calloc, malloc, dan free Dijelaskan
  5. Bahasa Pemrograman C++: Tinjauan & Fitur Utama
  6. Konstanta & Literal C++ Dijelaskan: Tipe, Sintaks, dan Praktik Terbaik
  7. Panduan Lengkap Operator C++: Tipe, Penggunaan, dan Praktik Terbaik
  8. Menguasai Tipe Numerik C++: Panduan Praktis
  9. Memahami Referensi C++: Konsep Utama & Perbedaan dengan Pointer
  10. Menguasai Memori Dinamis C++: Stack vs. Heap Dijelaskan