ASD

18
ASD Alokasi Memori Dinamis

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

Page 1: ASD

ASD

Alokasi Memori Dinamis

Page 2: ASD

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!!!

Page 3: ASD

Fungsi-Fungsi Alokasi Memory

Page 4: ASD

sizeof()

Page 5: ASD

Latihan

Page 6: ASD
Page 7: ASD

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)

Page 8: ASD

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

Page 9: ASD

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

Page 10: ASD

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!

Page 11: ASD

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();}}

Page 12: ASD

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();}}

Page 13: ASD

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();}}

Page 14: ASD

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

}}

Page 15: ASD

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; } }

Page 16: ASD

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!

Page 17: ASD

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

Page 18: ASD

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