ASD

Post on 12-Jan-2016

40 views 0 download

description

ASD. Alokasi Memori Dinamis. Alokasi Memori Dinamis. Untuk menggunakan sebuah variabel, kita harus mendeklarasikannya dulu Pada saat deklarasi, slot memori dipesan untuk dipakai oleh variabel tersebut Setelah dideklarasikan, variabel bisa digunakan. - PowerPoint PPT Presentation

Transcript of ASD

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 */