Alokasi Memori Dinamis di C++

Alokasi Memori Dinamis Di C



Biasanya, saat menggunakan kode sumber dalam bahasa pemrograman C++, kompiler mengalokasikan memori secara manual ke variabel untuk penyimpanan data. Dikatakan sebagai alokasi memori statis. Ini adalah memori tetap yang tidak dapat diubah setelah dideklarasikan. Untuk jenis alokasi memori ini, sistem operasi menggunakan tumpukan untuk menyimpan data. Dalam alokasi statis, memori dialokasikan sebelum kode sumber mulai dijalankan.

Sedangkan pada alokasi memori dinamis, memori dialokasikan saat eksekusi telah dimulai. Memori ini dialokasikan secara manual oleh programmer saat run-time, juga dikenal sebagai alokasi memori run-time di C++. Ukuran memori dinamis dapat diubah pada posisi manapun dalam program karena pada saat deklarasi, kami tidak menyebutkan ukuran yang dapat diperbaiki. Kami hanya memberikan nilai langsung ke variabel.

Perbedaan alokasi memori dengan variabel normal

Dalam variabel normal, memori yang dialokasikan oleh kompiler dialokasikan dan didealokasikan secara otomatis. Ketika memori dialokasikan secara dinamis oleh programmer, ia kemudian harus menghapus atau membatalkan alokasi memori ketika tidak ada gunanya dalam eksekusi lebih lanjut dari kode sumber. Situasi ini menyebabkan 'kebocoran memori' saat program dihentikan sementara memori tidak dialokasikan kembali.







Operator untuk alokasi dinamis

Dalam C++, dua operator membantu dalam alokasi dan dealokasi memori: 'baru' dan 'hapus' yang digunakan untuk alokasi dan dealokasi memori dengan cara yang lebih baik.



Operator baru

Ini menandakan permintaan untuk alokasi memori. Operator baru menginisialisasi memori dan mengembalikan alamat dari memori yang dialokasikan ke variabel penunjuk jika tersedia cukup memori.



objek penunjuk = baru data - Tipe ;

Hapus operator

Sama seperti operator baru, operator hapus digunakan untuk menghapus memori yang dialokasikan. Di C++, programmer dapat menggunakan operator ini untuk deallocation.





# Hapus variabel_penunjuk;

Contoh 1

Dalam contoh ini, kami akan memperkenalkan dua pointer: satu adalah pointer tipe integer dan yang lainnya adalah pointer float. Pointer diinisialisasi dengan menggunakan tanda asterisk dengannya.

# Int * titikInt;
# Float *pointfloat;

Dengan menggunakan kedua printer ini, kita akan mengalokasikan memori secara dinamis.



Peran penunjuk dalam alokasi dinamis:
Memori ruang penyimpanan dikembangkan dalam bentuk blok. Setiap kali kami menjalankan program atau melakukan operasi apa pun, memori dialokasikan untuk tujuan khusus itu. Memori itu memiliki alamat khusus yang dikaitkan dengan program yang mengidentifikasi proses atau program mana yang diizinkan ke memori itu. Slot memori apa pun diakses melalui alamat tempatnya. Jadi alamat ini disimpan melalui pointer. Singkatnya, kita membutuhkan penunjuk untuk mengakses memori dan dengan cara yang sama, mengalokasikan bagian tertentu dari memori untuk tugas apa pun. Pointer diperlukan untuk menyimpan alamat.

Karena kata kunci 'baru' digunakan untuk alokasi dinamis memori dalam alokasi manual, memori dialokasikan oleh kompiler. Kami tidak perlu mengalokasikan memori saat dijalankan. Tetapi karena alokasi dinamis bersifat acak, kita perlu mengidentifikasi penunjuk dan untuk proses pengikatan, operator baru ini digunakan.

# Pointint = int baru;

Demikian pula, floating pointer terikat juga. Setelah proses pengikatan, kami akan menetapkan nilai apa pun ke memori yang ingin kami pesan untuk operasi apa pun. Dengan mendeklarasikan penunjuk, kami menetapkan nilai tertentu ke memori.

# *pointInt = 50;

Nilai float untuk point float juga dideklarasikan. Tampilkan nilai setelah ditetapkan.

Seperti yang telah kita bahas, operator 'baru' digunakan untuk mengalokasikan sementara 'hapus' digunakan untuk membatalkan alokasi memori. Jadi, setelah Anda menyelesaikan tugas atau operasi dalam kode, kami akan menghapus memori yang telah kami alokasikan untuk tugas tersebut.

Lebih baik membatalkan alokasi bagian memori itu sehingga proses lain dapat memanfaatkan ini. Kami akan menerapkan alokasi ini ke kedua pointer.

Hapus titik mengambang ;

Setelah Anda menyimpan kode pada editor teks, terminal Ubuntu memungkinkan Anda untuk mengeksekusi kode sumber di dalam file melalui kompiler g++.

$ g++ -o mem mem.c
$ ./mem

Setelah eksekusi, Anda akan melihat nilai yang ditetapkan ke memori.

Contoh 2

Contoh ini memiliki keterlibatan interaksi pengguna. Kami akan mengambil variabel angka yang akan berisi nilai dari pengguna. Program ini akan menyimpan hasilnya dalam IPK mahasiswa. Semua hasil akan disimpan pada saat dijalankan.

Saat pengguna memasukkan jumlah siswa, memori dialokasikan untuk setiap nomor. Pointer tipe float diinisialisasi di sini yang akan digunakan dalam alokasi memori hasil.

Kami mengambil pointer di float karena IPK dalam notasi desimal. Kami mengambil array tipe pointer untuk IPK karena dapat menghasilkan sejumlah siswa.

Ptr = baru mengambang [ pada satu ]

Array penunjuk dengan kata kunci 'baru' ini akan mengikat eksekusi dengan memori. IPK akan dimasukkan untuk setiap siswa. Karena kita tidak mengetahui jumlah mahasiswa yang ingin ditambahkan oleh pengguna, kita menggunakan perulangan for untuk memasukkan IPK hingga angka yang dimasukkan. Di setiap pengulangan loop, pengguna diminta untuk memasukkan hasil yang mengidentifikasi siswa. Setelah hasilnya disimpan, kami akan kembali menggunakan loop untuk menampilkan semua IPK siswa. Pada akhirnya, array tipe penunjuk dihapus, karena tujuan penyimpanan dinamis telah tercapai.

Menghapus [ ] ptr ;

Sekarang kita akan mengeksekusi kode yang disebutkan di atas. Pengguna akan diminta terlebih dahulu untuk memasukkan jumlah siswa. Kemudian IPK masing-masing mahasiswa akan dimasukkan.

Contoh 3

Contoh ini menggunakan operator baru dan hapus untuk objek kelas. Kelas ini berisi variabel pribadi bertipe integer yang menyimpan umur. Di bagian publik kelas, konstruktor dibuat yang akan menginisialisasi usia ke angka '10'. Fungsi lain digunakan di sini yang akan menampilkan usia yang diinisialisasi dalam konstruktor.

Sekarang kita akan menuju ke program utama untuk alokasi dinamis. Objek kelas dibuat secara dinamis.

Murid * ptr = baru murid ( ) ;

Saat objek terbentuk, konstruktor akan diimplementasikan secara otomatis. Panggilan fungsi akan dilakukan untuk mendapatkan usia. Ini akan dilakukan melalui ptr.

Ptr - > getAge ( ) ;

Dan pada akhirnya, memori akan dilepaskan.

Kesimpulan

Alokasi memori dinamis dialokasikan pada eksekusi run time oleh pemrogram alih-alih penyimpanan tetap yang diidentifikasi oleh kompiler. Alokasi ini secara acak dan dapat dihilangkan setelah digunakan. Padahal, dalam banyak kasus, sebelum penghapusan, proses eksekusi berhenti dan alokasi dinamis ini kemudian menyebabkan kebocoran memori. Kami telah menerapkan fenomena ini dalam berbagai pendekatan di sistem Linux Ubuntu menggunakan bahasa pemrograman C++.