• Tidak ada hasil yang ditemukan

Dynamic memory

Dalam dokumen Kata Pengantar - CC Programming (Halaman 93-100)

Dynamic memory.

Kadang-kadang kita membutuhkan variabel dengan ukuran yang baru dapat ditentukan pada saat runtime, misalnya kita menanyakan jumlah data pada user, mengalokasikan memori untuk menyimpan data.

Dalam hal ini kita membutuhkan dynamic memory, dimana pada C++ dapat digunakan operator new dan delete.

Operator new dan delete adalah khusus untuk C++.

Operators new and new[ ]

Dalam usaha untuk memesan dynamic memory, digunakan operator new. new diikuti dengan suatu data type dan secara optional jumlah elemen yang diperlukan dalam brackets []. Akan mengembalikan suatu pointer pada awal dari blok memori yang berhasil dialokasi. Bentuknya adalah:

pointer = new type // deklarasi 1 elemen atau

pointer = new type [elements] // deklarasi array

Contoh:

int * bobby;

bobby = new int [5];

dalam hal ini, akan dialokasi 5 elemen dengan type int pada suatu heap dan

mengembalikan sebuah pointer yang menunjuk pada alamat awal ke variabel bobby.

Sesuatu hal yang perlu diperhatikan bahwa dynamic memori tidak selamanya akan berhasil dialokasi karena kehabisan memori. Jika hal ini terjadi maka permintaan operator new, akan mengembalikan suatu null pointer. Untuk alasan tersebut, maka disarankan untuk selalu memeriksa apakah pointer yang dikembalikan adalah NULL setelah pemanggilan new.

int * bobby;

bobby = new int [5]; if (bobby == NULL) {

// error assigning memory. Take measures.

}; Operator delete.

Jika dynamic memory yang dialokasi tidak dibutuhkan lagi, maka dapat dihapus dari memori dengan menggunakan operator delete:

delete pointer; or

delete [] pointer;

Contoh Program :

//Program mencari rata-rata //Oleh : Hendra Soewarno

//Dengan memanfaatkan fasilitas alokasi dinamis new dan delete #include <iostream.h> #include <stdlib.h> int *pdat; int jd; void tanyajd(); void alokasimemory(); void bacadata(); void hitungrata(); void dealokasimemory(); int main() { tanyajd(); alokasimemory(); bacadata(); hitungrata(); dealokasimemory(); return 0; } void tanyajd() {

cout << "jumlah data :"; cin >> jd;

}

void alokasimemory() {

pdat = new int[jd];

{

cout << "gagal alokasi memory"<<endl; exit(0);

} }

void bacadata() {

for (int i=0;i<jd;i++) {

cout << "data ke -" << i+1 << " : "; cin >> pdat[i]; } } void hitungrata() { float rata; rata = 0;

for (int i=0;i<jd;i++)

rata = rata + (float) pdat[i]/jd; cout << "nilai rata-rata :"<<rata<<endl; }

void dealokasimemory() {

delete pdat;

}

Dynamic memory in ANSI-C

Operator new dan delete hanya terdapat pada C++ dan tidak tersedia pada C language. Pada C language, untuk mengalokasi dynamic memory kita dapat menggunakan library

stdlib.h. Kita dapat juga menggunakannya dalam C++. The function malloc

Ini adalah fungsi generic untuk alokasi dynamic memory pada pointer. Adapun prototype-nya adalah:

void * malloc (size_t nbytes);

dimana nbytes adalah jumlah byte yang akan diberikan ke pointer. Function ini akan

mengembalikan sebuah pointer dengan type void*, oleh karena itu kita perlu melakukan type cast terhadap nilai pointer yang ingin dihasilkan, contoh:

char * ronny;

ronny = (char *) malloc (10);

Jika kita ingin memberikan suatu blok data dengan type data yang bukan char (berukuran lebih dari 1 byte) kita harus mengalikan jumlah elemen yang diinginkan dengan ukuran elemen dari tiap-tiap elemen, dalam hal ini kita dapat menggunakan operator sizeof :

int * bobby;

bobby = (int *) malloc (5 * sizeof(int));

Kode ini akan memberikan pada bobby sebuah pointer yang terdiri dari 5 data integer. The function calloc.

calloc hampir menyerupai operasi malloc, perbedaan utamanya adalah pada prototype:

void * calloc (size_t nelements, size_t size);

menggunakan dua parameter, yang pertama (nelements) adalah jumlah elemen dan kedua (size) adalah ukuran masing-masing elemen. Alokasi untuk bobby dapat ditulis

menjadi:

int * bobby;

bobby = (int *) calloc (5, sizeof(int));

Perbedaan lain antara malloc dan calloc adalah calloc menginisialisasi semua elemennya menjadi 0.

The function realloc.

Mengubah ukuran dari suatu blok memori yang telah diberikan pada suatu pointer.

void * realloc (void * pointer, size_t size);

pointer parameter menerima sebuah pointer yang telah diberikan suatu blok memori atau null pointer, dan size menentukan ukuran baru dari memori blok yang diinginkan.

Dalam hal ini isi pointer lama tidak akan berubah. Jika proses alokasi tambahan gagal akan mengembalikan suatu null pointer, sedangkan isi pointer sebelumnya tidak berubah. The function free.

Membebaskan blok dynamic memory yang sebelumnya telah diberikan dengan malloc, calloc atau realloc.

void free (void * pointer);

Fungsi ini hanya dapat digunakan untuk membebaskan memori yang diberikan dengan fungsi malloc, calloc dan realloc.

Contoh program :

//Program mencari rata-rata //Oleh : Hendra Soewarno

//Dengan memanfaatkan fasilitas alokasi dinamis malloc dan free #include <iostream.h> #include <stdlib.h> int *pdat; int jd; void tanyajd(); void alokasimemory(); void bacadata(); void hitungrata(); void dealokasimemory(); int main() { tanyajd(); alokasimemory(); bacadata(); hitungrata(); dealokasimemory(); return 0; } void tanyajd() {

cout << "jumlah data :"; cin >> jd;

}

void alokasimemory() {

pdat = (int*) malloc(jd * sizeof(int)); //pdat = (int*) calloc(jd, sizeof(int));

if (pdat == NULL) {

cout << "gagal alokasi memory"<<endl; exit(0);

} }

void bacadata() {

for (int i=0;i<jd;i++) {

cout << "data ke -" << i+1 << " : "; cin >> pdat[i]; } } void hitungrata() { float rata; rata = 0;

for (int i=0;i<jd;i++)

rata = rata + (float) pdat[i]/jd; cout << "nilai rata-rata :"<<rata<<endl; }

void dealokasimemory() {

free(pdat); }

//Program mencari rata-rata //Oleh : Hendra Soewarno

//Dengan memanfaatkan fasilitas alokasi dinamis realloc dan free #include <iostream.h> #include <stdlib.h> int *pdat; int jd; void bacadata(); void hitungrata(); void dealokasimemory(); int main() { bacadata(); hitungrata(); dealokasimemory(); return 0; } void bacadata() { int dat; jd = 0; do { cout << "data ke -" << jd+1 << " : "; cin >> dat; if (!dat==0) {

if (realloc(pdat,dat*sizeof(int)) == NULL) { cout << "gagal alokasi memory !"<<endl; exit(0); } else { pdat[jd] = dat; jd++; } } } while (!dat==0); } void hitungrata() { float rata; rata = 0;

for (int i=0;i<jd;i++)

rata = rata + (float) pdat[i]/jd; cout << "nilai rata-rata :"<<rata<<endl; }

void dealokasimemory() {

free(pdat); }

Pertanyaan

1. Bagaimana mengalokasikan memory dinamis ?

2. Bagaimana kita mengetahui suatu alokasi memori berhasil atau tidak ? 3. Terangkan perbedaan cara untuk alokasi memori dinamis pada C dan C++! 4. Bagaimana kita mengetahui ukuran dari suatu data type ?

Latihan

1. Buatlah suatu program untuk menyimpan data yang dimasukan oleh pemakai, urut data tersebut dalam urutan descending, kemudian coba cari data yang dimasukan oleh pemakai. Petunjuk : Tanyakan jumlah data terlebih dahulu dengan memanfaatkan alokasi memori dinamis.

Dalam dokumen Kata Pengantar - CC Programming (Halaman 93-100)

Dokumen terkait