Post on 12-Jan-2016
description
ASD
Alokasi Memori Dinamis
Alokasi Memori DinamisAlokasi Memori Dinamis
Untuk menggunakan sebuah variabel, kita harus Untuk menggunakan sebuah variabel, kita harus mendeklarasikannya dulumendeklarasikannya dulu
Pada saat deklarasi, slot memori dipesan untuk Pada saat deklarasi, slot memori dipesan untuk dipakai oleh variabel tersebutdipakai oleh variabel tersebut
Setelah dideklarasikan, variabel bisa digunakanSetelah dideklarasikan, variabel bisa digunakan
Ada cara untuk membuat variabel tanpa Ada cara untuk membuat variabel tanpa deklarasi!!!deklarasi!!!
Variabel tersebut baru dibuat saat dibutuhkan Variabel tersebut baru dibuat saat dibutuhkan ketika program berjalan!!!ketika program berjalan!!!
Setelah selesai digunakan, variabel tersebut Setelah selesai digunakan, variabel tersebut harus dihapus!!!harus dihapus!!!
Fungsi-Fungsi Alokasi Memory
sizeof()
Latihan
Cara membuat variabel Cara membuat variabel tanpa deklarasitanpa deklarasi
1.1. Deklarasikan pointer yang menunjuk variabel Deklarasikan pointer yang menunjuk variabel yang akan dibuatyang akan dibuat
2.2. Jika pada saat program berjalan variabel Jika pada saat program berjalan variabel tersebut dibutuhkantersebut dibutuhkan Pesan slot memori untuk menyimpan Pesan slot memori untuk menyimpan
variabel (malloc)variabel (malloc) Simpan alamat slot memori pada pointer no Simpan alamat slot memori pada pointer no
11 Gunakan variabel sesuai kebutuhan dengan Gunakan variabel sesuai kebutuhan dengan
cara akses tak langsung melalui pointercara akses tak langsung melalui pointer Hapus variabel / lepas slot memori setelah Hapus variabel / lepas slot memori setelah
variabel selesai digunakan (free)variabel selesai digunakan (free)
Karakteristik Alokasi Memori Karakteristik Alokasi Memori DinamisDinamis
Memori dapat dipesan atau dilepas sesuai Memori dapat dipesan atau dilepas sesuai kebutuhan pada saat program berjalankebutuhan pada saat program berjalan
Memesan slot memori menggunakan fungsi Memesan slot memori menggunakan fungsi mallocmalloc
Melepas slot memori menggunakan fungsi freeMelepas slot memori menggunakan fungsi free
malloc:malloc:memesan memori untuk variabel memesan memori untuk variabel
baru baru
(tipedata *)(tipedata *) malloc(malloc(sizesize););
Membuat pointer yang menunjuk slot memori yang dipesan. Tipe pointer sesuai tipe variabel yang dibuat
Banyaknya slot memori yang dipesan untuk menyimpan variabel baru ( gunakan fungsi sizeof()sizeof()untuk mengetahui ukuran variabel).
malloc()malloc()prototype ada di stdlib.hstdlib.h
free:free:menghapus variabel setelah menghapus variabel setelah
digunakandigunakanvoid freevoid free(pMemBlock);(pMemBlock);
Pointer yang menunjuk variabel
free() free() ada di stdlib.hstdlib.h
IMPORTANT!!!!!!IMPORTANT!!!!!!: • jangan free()free()pointer yang tidak pernah di malloc()malloc()•Jangan free() free() pointer yang sudah difree • Selalu free()free()variabel yang sudah selesai digunakan. Jika tidak, akan menyebabkan: ‘memory leakmemory leak’ – BAD!BAD!
Contoh tanpa Contoh tanpa malloc()malloc()#include <stdio.h>#include <stdio.h>#include <conio.h>#include <conio.h>
int int main()main(){{
float jari, luas;float jari, luas;
jari = 7;jari = 7; luas = 3.14 * jari * jari;luas = 3.14 * jari * jari; cout << “cout << “lingkaran dengan jari-jari : “lingkaran dengan jari-jari : “ << << jari;jari; cout << cout << ““\n\nluasnya : “luasnya : “ << << luas;luas;
getch();getch();}}
Contoh dengan Contoh dengan malloc()malloc()#include <stdio.h>#include <stdio.h>#include <conio.h>#include <conio.h>#include <stdlib.h>#include <stdlib.h>
void main()void main(){{ //deklarasi pointer//deklarasi pointer
float *pjari, *pluas;float *pjari, *pluas;
//memesan slot memori untuk membuat variabel jari & luas. Simpan alamatnya pada pointer//memesan slot memori untuk membuat variabel jari & luas. Simpan alamatnya pada pointer pjari = (float *)malloc(sizeof(float));pjari = (float *)malloc(sizeof(float)); pluas = (float *)malloc(sizeof(float));pluas = (float *)malloc(sizeof(float));
if (if (pjari != NULL && pluas != NULLpjari != NULL && pluas != NULL){//jika berhasil memesan memori){//jika berhasil memesan memori //gunakan variabel jari dan luas melalui pointer//gunakan variabel jari dan luas melalui pointer *pjari = 7;*pjari = 7; *pluas = 3.14 * *pjari * *pjari;*pluas = 3.14 * *pjari * *pjari; cout << cout << "lingkaran dengan jari-jari : “"lingkaran dengan jari-jari : “ << << *pjari; *pjari; cout << cout << ““\n\nluasnya : ", *pluas;luasnya : ", *pluas;
//menghapus atau melepaskan slot memori yang ditunjuk oleh pjari dan pluas//menghapus atau melepaskan slot memori yang ditunjuk oleh pjari dan pluas free(pjari);free(pjari); free(pluas);free(pluas); }}
getch();getch();}}
Contoh tanpa Contoh tanpa malloc()malloc()#include <stdio.h>#include <stdio.h>#include <conio.h>#include <conio.h>
struct motor{struct motor{ float amps;float amps; float volts;float volts;};};
typedef struct motor motor;typedef struct motor motor;
intint main() main(){{ motor m;motor m;
m.volts = 4.5;m.volts = 4.5; m.amps = 6;m.amps = 6; cout << cout << "volts =“"volts =“ << << m.volts; m.volts; cout << cout << ““\n\namps =“amps =“ << << m.amps; m.amps; getch();getch();}}
Latihan : dengan Latihan : dengan malloc?malloc?#include <stdio.h>#include <stdio.h>
#include <conio.h>#include <conio.h>#include <stdlib.h>#include <stdlib.h>
struct motor{struct motor{ float amps;float amps; float volts;float volts;};};
typedef struct motor motor;typedef struct motor motor;
void main()void main(){{
motor *m; motor *m; // Buat alokasi memory dinamis// Buat alokasi memory dinamis
// Cek alokasi memory ...........// Cek alokasi memory ...........// Free / bebaskan alokasi memory yang dipesan ....// Free / bebaskan alokasi memory yang dipesan ....
}}
Peringatan!!! - mallocPeringatan!!! - malloc• Jika malloc()malloc() gagal memesan memori,
akan mengembalikan NULLNULL
• Selalu cek apakah malloc()malloc() mengembalikan NULLNULL:
char *pMsg;char *pMsg;
pMsg = (char *) malloc (sizeof(char));pMsg = (char *) malloc (sizeof(char)); if (pMsg == NULL) if (pMsg == NULL) { { cout <<cout <<“Insufficient memory. Error Exit”;“Insufficient memory. Error Exit”; return -1; return -1; } }
Peringatan!!! Peringatan!!! malloc()malloc()
• Selalu free() variabel yang sudah selesai dipakai
• Jika tidak akan menyebabkan ‘memory ‘memory leaks’leaks’
• Bisa terjadi crash karena kehabisan memori!
Peringatan!!! - freePeringatan!!! - free• Hati – hati!!!Hati – hati!!! :
Jangan pernah mem-free slot memori yang sudah di free!
char *pMsg, *pWord, aLetter;char *pMsg, *pWord, aLetter;
pMsg = (char *) malloc (20 * sizeof(char);pMsg = (char *) malloc (20 * sizeof(char);
pWord = pMsg;pWord = pMsg; /* both point to same byte 0 /* both point to same byte 0 */ */
strcpy(pWord, “Welcome!\n”); /* use the memory */strcpy(pWord, “Welcome!\n”); /* use the memory */
free(pMsg);free(pMsg); /* Free the memory. /* Free the memory. */ */
free(pWord);free(pWord); /* RUNTIME ERROR! No block to free! *//* RUNTIME ERROR! No block to free! */
Peringatan!!! - freePeringatan!!! - free• free()free()membebaskan slot memori yang
ditunjuk sebuah pointer.• Jika ada pointer lain yang menunjuk ke
alamat slot yang sama, maka pointer tersebut menjadi invalid! Jangan difree lagi!
char *pMsg, *pWord, letr = ‘A’;char *pMsg, *pWord, letr = ‘A’;
pMsg = (char *) malloc (20 * sizeof(char));pMsg = (char *) malloc (20 * sizeof(char)); /* reserve a memory block *//* reserve a memory block */
pWord = pMsg; pWord = pMsg; /* another pointer to block*//* another pointer to block*/
pMsg = &aLetter; pMsg = &aLetter; /* pMsg now points to letr *//* pMsg now points to letr */
free(pWord); free(pWord); /* free the memory block *//* free the memory block */