Pada pembahasan memori dinamis ada istilah dasar yang kalian harus ketahui, yaitu Allocation dan Deallocation.
- Allocation (Alokasi) adalah upaya yang dilakukan program dalam memesan memori kepada CPU.
- Deallocation (Dealokasi) adalah upaya pelepasan memori yang sebelumnya telah dipesan, dipakai dan memori tersebut sudah tidak dibutuhkan lagi. Memori akan dilepaskan dan dikembalikan pada CPU, memori tersebut akan tersedia kembali pada CPU untuk permintaan alokasi.
Memori Dinamis
Dynamic Memory atau dalam Bahasa Indonesia disebut Memori dinamis, adalah suatu teknik alokasi memori yang memungkinkan program memesan memori di saat program berjalan (runtime) bukan di saat eksekusi program.
Misalnya, jika program pada awalnya hanya memiliki memori statis yang sudah programmer pesan dan tulis saat pengkodingan. Kemudian suatu saat pengguna program tersebut membutuhkan penyimpanan data lebih yang tak terduga, otomatis dia membutuhkan memori lagi untuk menyimpan data tersebut.
Dengan teknik memori dinamis kita bisa memungkinkan pengguna dari program kita mendapatkan memori lebih. Memungkinkan kita untuk membuat program yang dapat meminta memori tambahan sebanyak yang diperlukan untuk penyimpanan data, dan penambahan memori itu dilakukan saat runtime.
Di contoh program yang penulis berikan pada artikel sebelumnya, penyimpanan data yang mereka lakukan masih bersifat memori statis yang biasanya dilakukan dengan menggunakan variabel biasa. Memori statis adalah memori yang kita pesan melalui mendirikan sebuah variabel ,obyek dan lain-lain, Memori yang dipakai oleh variabel atau obyek akan memiliki jumlah yang tetap. Mereka tidak aktif dalam alokasi memori saat program di jalankan, dengan arti pengguna hanya akan memanfaatkan memori yang sudah di siapkan pada program tersebut, kita tidak dimungkinkan untuk menyimpan data baru sekaligus mempertahankan yang lama.
Jika kalian berpikir untuk masih tetap menggunakan memori statis, dan dapat menangani masalah kebutuhan pengguna menggunakan memori statis. kita secara terpaksa harus menambah memori-memori statis lainya sebanyak yang pengguna butuhkan. Tapi hal itu akan terlihat konyol karena di saat runtime kebutuhan memori pengguna tidak akan bisa diprediksi.
Bukan hanya alokasi memori, kita juga dimungkinkan menghapus dan membebaskan memori yang telah di pesan saat tidak membutuhkanya lagi untuk meringankan beban program. Memori yang sudah bebas akan tersedia untuk pemesanan atau alokasi memori berikutnya. dan Satu-satunya cara untuk mengakses variabel dinamis adalah dengan menggunakan pointer.
Sebelum kita membahas memori dinamis lebih dalam kita harus sedikit memahami dasar dari memori. Dalam sistem anda terdapat banyak jenis memori, dan ada dua memori yang harus anda tau dan sering digunakan dalam alokasi memori pada program kita, yaitu :
Stack / Tumpukan | : Semua variabel yang dideklarasikan di dalam function akan mengambil memori dari stack. |
Heap | : adalah memori yang tidak dipakai dalam program dan bisa digunakan untuk mengalokasi memori secara dinamis di saat program jalan. |
Untuk membuat memori dinamis pada bahasa pemrograman C Kita bisa menggunakan malloc
, calloc
, realloc
, dan free
. Dalam Bahasa pemrograman C++ terdapat new
dan delete
. Anda dimungkinkan menggunakan fitur dari C dalam C++. tapi penulis sarankan jika menggunakan Bahasa pemrograman C++ gunakanlah fitur-fitur dari C++, karena biasanya fitur dari C++ merupakan pengembangan fitur dari C yang dibuat lebih canggih dan dikhususkan untuk pemrograman C++.
Macam-macam Operator Memori
Malloc
malloc
adalah fungsi standar untuk mengalokasi memori, urdalam bahasa C, juga tersedia pada C++, malloc
terdapat pada <stdlib.h>
/ <cstdlib>
. malloc
berfungsi untuk mengatur alokasi memori pada heap sebanyak byte yang dibutuhkan, pengaksesan blok memory dilakukan melalui sebuah pointer dan pada saat pemesanan memori tidak dilakukan inisialisasi.
Bentuk umum penulisan
void* malloc (size_t size) ;
Size = besar memori tipe data.
Contoh Penulisan
varFoo = (char*) malloc (sizeof(char)) ;
Calloc
calloc
adalah fungsi standar untuk mengalokasikan memori dan blok untuk penyimpanan (array), dalam bahasa C, juga tersedia pada C++, calloc
terdapat pada <stdlib.h>
/ <cstdlib>
. calloc
berfungsi untuk mengalokasi beberapa elemen memori secara diamis dari heap dan ukuran memori ditentukan pada argumen yang di bungkus dalam subscript. Bedanya calloc dan malloc adalah calloc secara otomatis akan meng-inisialisasi semua elemen dengan NOL.
Bentuk umum penulisan
void* calloc (size_t num, size_t size) ;
Num = jumlah block/elemen yang akan dipesan.
Size = besar memori tipe data.
Contoh Penulisan
varFoo = (int*) calloc (5, sizeof(int)) ;
Realloc
realloc
adalah fungsi standar untuk menambah atau mengurangi ukuran blok, dalam bahasa C, juga tersedia pada C++, realloc
terdapat pada <stdlib.h>
/ <cstdlib>
. realloc
berfungsi untuk menambah atau mengurangi blok atau elemen memori yang telah dialokasikan secara dinamis dan juga memori dinamis yang memiliki elemen.
Bentuk umum penulisan
void* realloc (void* ptr, size_t size) ;
Ptr = pointer ke suatu alokasi memori yang sizenya/block akan diubah.
Size = besar memori tipe data.
Contoh penulisan
varFoo = (int*) realloc (varPertama, sizeof(int)) ;
Free
free
adalah fungsi standar untuk menghapus, melepaskan atau membebaskan memori, dalam bahasa C, juga tersedia pada C++, free
terdapat pada <stdlib.h>
/ <cstdlib>
. free
berfungsi untuk menghapus, melepaskan atau membebaskan memori yang telah terpakai dan tidak digunakan lagi, memori tersebut akan di kembalikan ke sistem dan tersedia untuk alokasi/pemesanan memori berikutnya.
Bentuk umum penulisan
void free (void* ptr) ;
ptr = target pointer untuk dbebaskan.
Contoh penulisan
free (targetVar) ;
New
new
adalah fungsi standar untuk memesan atau alokasi memori, berasal dari bahasa C++, fungsi ini disarankan untuk pengguna C++. Fungsi new
sama seperti beberapa fungsi alokasi pada bahasa C. new
berfungsi untuk mengatur alokasi memori secara dinamis pada heap sebanyak byte berdasarkan tipe data yang disebutkan.
Bentuk umum penulisan
//Allocation memori biasa varPointer = new typeData ; //Allocation memori bebentuk array varPointer = new typeData [index] ;
Contoh Penulisan
varPointer = new int; varPointer = new int [10]; //array
Delete
delete
adalah fungsi standar untuk menghapus atau membebaskan memori yang telah di pesan, berasal dari bahasa C++, fungsi ini disarankan untuk pengguna C++, fungsi delete
sama seperti free
pada bahasa C. delete
berfungsi untuk menghapus, membebaskan atau melepaskan memori yang telah terpakai dan tidak digunakan lagi, memori tersebut akan di kembalikan ke sistem dan tersedia untuk alokasi/pemesanan memori berikutnya.
Bentuk umum penulisan
//Deallocation untuk memori biasa delete pointer; //Deallocation untuk bentuk array delete []pointer;
Fitur memori dinamis di jaman sekarang adalah salah satu fitur yang wajib ada dalam program apapun itu, karena dengan memori dinamis program dapat melayani pengguna dan dapat menyesuaikan kebutuhan pengguna terutama dalam penyimpanan. Di atas penulis telah menjelaskan sedikit tentang dasar pengertian memori dan beberapa keyword dan function yang dapat anda gunakan dalam melakukan teknik memori dinamis.
Setelah kita mengetahui semua itu, penulis akan jelaskan dasar bagaimana cara melakukan upaya memori dinamis dengan menggunakan keyword yang berasal dari Bahasa C++ yaitu new
dan delete
.
Cara Alokasi Memori
New
adalah keyword yang memungkinkan program untuk alokasi atau meminta memori pada CPU untuk persediaan pengguna program. New
memiliki dua kemampuan yaitu dapat melakukan alokasi sebuah memori dan banyak memori (array).
Contoh Penulisan
myVar = new int; //alokasi sebuah memori myArr = new int[5]; //alokasi array sebanyak 5 elemen
seperti yang telah dicontohkan di atas, untuk melakukan alokasi memori dibutuhkan keyword new sebagai rvalue dan diikuti dengan tipe data. Jika ingin memesan sebuah array anda dapat menambahkan operator subscript dengan jumlah memori yang anda inginkan.
Memori yang dialokasi hanya dapat diakses dengan pointer, pada awalnya pointer tidak menunjuk ke alamat memori manapun (tidak memiliki nilai), saat alokasi program anda meminta pada CPU sebuah memori atau banyak memori (array) dengan bentuk tipe data yang disebutkan.
Jika tunggal dan memesan memori bertipe int maka kita akan mendapatkan memori sebesar 4 byte. Jika memesan memori majemuk int sebanyak 5 elemen maka kita mendapatkan array integer sebanyak 5 elemen.
Setelah program kita meminta maka CPU akan memberikan alamat memori yang tersedia. Pointer akan menunjuk ke alamat memori pertama dari memori yang telah diberikan oleh CPU, hal itu berlaku pada pemesanan memori tunggal maupun majemuk.
Cara Dealokasi Memori
Sesuatu hal yang telah kita pinjam pasti kita memiliki kewajiban untuk mengembalikan, dalam alokasi memori kita juga memiliki kewajiban untuk mengembalikan memori tersebut kepada CPU di saat memang memori tersebut sudah tidak kita butuhkan, dan hal tersebut dinamakan sebagai dealokasi memori.
Dalam C++ untuk melakukan dealokasi kita dapat menggunakan delete
, yang merupakan keyword yang memungkinkan untuk melepaskan (mengembalikan) memori yang telah kita pesan kepada CPU. memori yang telah kita kembalikan ke CPU akan tersedia kembali untuk permintaan alokasi berikutnya.
Sama seperti New
, Delete
juga memiliki dua jenis yaitu digunakan untuk memori tunggal dan memori majemuk (array).
Contoh penulisan :
delete myVar; //Melepaskan sebuah memori delete[] myArr; //Melepaskan memori majemuk
Contoh Program :
#include <iostream> using namespace std; int main(){ int i; cout<<"Anda membutuhkan berapa memori untuk menyimpan data integer ? "<<endl; cin>>i; int *data = nullptr; data = new int[i]; //Pemesanan memori cout<<"memori telah dipesan dan memiliki "<<i<<" elemen"<<endl<<"silahkan anda isi :"<<endl; //Input for(int n=0;n<i;n++){ cout<<&data[n]<<" = ";cin>>data[n]; } cout<<endl<<"Memori telah di isi berikut adalah isi dari memori anda :"<<endl; //Output for(int n=0;n<i;n++){ cout<<&data[n]<<" = "<<data[n]<<endl; } cout<<endl<<"...Memproses Pelepasan Memori..."<<endl; delete[] data; //pelepasan memori. data = nullptr; cout<<"Memori telah dilepaskan dan variabel 'data' memiliki nilai = "<<data<<endl; return 0; }
Contoh program di atas menggunakan teknik memori dinamis, kita bisa merasakanya seberapa dinamisnya program tersebut yang dapat memenuhi kebutuhan pengguna. Di atas penulis mendirikan memori dinamis berupa array dan di saat program berjalan pengguna akan ditanyakan berapa jumlah memori yang dibutuhkan. Pemesanan memori akan dilakukan saat runtime dan menyediakan sesuai kebutuhan untuk pengguna.
Setelah semua selesai, dan saat memori tersebut tidak dibutuhkan lagi, penulis mendirikan pernyataan delete
dan melepas memori yang telah dipesan dan yang ditunjuk oleh variabel data
.
Menghapus atau melepaskan memori bukan berarti pointer tersebut akan berhenti menunjuk ke memori tersebut. kita masih dapat mengakses memori tersebut tapi hal itu merupakan tindakan illegal, karena memori tersebut sudah bukan milikmu dan biasanya memori tersebut sudah berada di tempat penyediaan memori untuk permintaan peminjaman memori selanjutnya.
Jika anda mengakses memori tersebut, mengubah nilainya dan lain-lain. Itu sama halnya seperti anda telah menjual mobil anda, ketika mobil anda sudah dimiliki oleh si pembeli tapi anda tetap menggunakanya atau malah memodifikasinya. Hal tersebut bisa disebut tindakan illegal.
Maka untuk mengatasi hal tersebut disarankan untuk memberikan nilai null pada variabel pointer yang baru saja melakukan pelepasan memori.
Penting : Setelah alokasi memori sangat disarankan untuk menghapus atau membebaskan jika sudah tidak dibutuhkan lagi, hal itu untuk mencegah kebocoran memori atau memory leak.
Nothrow
Dalam alokasi, permintaan peminjaman memori pada CPU tidak selalu berhasil, kadang CPU akan menolak permintaan tersebut dengan memberikan error bad_alloc
, dan setelah itu kadang akan membuat program anda berhenti (crash) karena error yang tidak bisa ditangani.
Untuk mengatasi hal tersebut disediakanlah keyword std::nothrow
, yang secara fungsi mirip seperti expection tapi keyword nothrow
lebih baik untuk menangani hal seperti ini.
std::nothrow
adalah keyword yang berasal dari header <new>
dan digunakan untuk menangani error bad_alloc
yang diberikan oleh CPU.
bad_alloc
kadang akan membuat program kita berhenti (crash) karena program tidak dapat menanganinya, dan nothrow
akan menangani hal tersebut. ketika program mendapatkan bad_alloc
, nothrow
akan menangani dengan cara menggantikan kasus bad_alloc
dengan memberikan nilai null pada pointer. Dengan hal itu program akan tetap berjalan dengan baik.
Contoh Penulisan
p= new (std::nothrow) int[i];
untuk menggunakan keyword nothrow
kita cukup dengan menambahkanya sebagai argument dari new
.
Contoh Program
#include <iostream> #include <new> int main() { while (true) { int* p = new(std::nothrow) int[100000000]; // non-throwing overload if (p == nullptr) { std::cout << "Allocation mendapatkan nullptr\n"; break; }else{ std::cout << "Berhasil di alokasi\n"; } } }
Hasil di komputer penulis
Berhasil di alokasi
Berhasil di alokasi
Berhasil di alokasi
Berhasil di alokasi
Allocation mendapatkan nullptr
trimakasih banyak…, sangat bermanfaat, sebelumnya izin share dan copas ya min…..
trimakasih banyak, sangat bermanfaat, sebelumnya izin share dan copas ya min…..
misal :
int *p;
p=(int *)malloc(sizeof(int));
apakah itu termasuk mendinamiskan penghubung p ya kak..?
jadi pointer p itu berarti cara menghubungi p ke variabel atau alamat lainnya , nah jika konteksnya seperti malloc di atas berarti apakah benar kak untuk mendinamiskan *p itu sendiri…?
mohon jawabannya ya kak…
Valuable info. Lucky me I discovered your website by accident, and I’m stunned why this twist of fate did not happened earlier!
I bookmarked it.