Memori Dinamis

Posted on   Februari 18, 2018   |   Last Modified   Februari 19, 2018
Memori Dinamis

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++.

Baca :   Fungsi

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.

Baca :   Macam-macam Operator Relasi dan Perbandingan

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.

Baca :   Tata Letak Memori

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


Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *