From c8747ca2e6c7efb471425a2c912d57ba032a0fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eckl=2C=20M=C3=A1t=C3=A9?= <ecklm@sch.bme.hu> Date: Tue, 14 Apr 2015 07:55:46 +0200 Subject: [PATCH] =?UTF-8?q?A=20free()=20elm=C3=A9letileg=20j=C3=B3l=20m?= =?UTF-8?q?=C5=B1k=C3=B6dik,=20a=20jelenlegi=20main.cpp=20elvileg=20minden?= =?UTF-8?q?=20gyenges=C3=A9g=C3=A9t=20kipr=C3=B3b=C3=A1lja,=20=C3=A9s=20ez?= =?UTF-8?q?ekre=20helyes=20kimenetet=20ad.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NHF/main.cpp | 10 +++++++--- NHF/src/heap.cpp | 21 ++++++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/NHF/main.cpp b/NHF/main.cpp index 5cfadaf..efa44ac 100644 --- a/NHF/main.cpp +++ b/NHF/main.cpp @@ -9,11 +9,15 @@ int main() { heap mem(20); cout<<mem; - cout<<mem.allocate(5)<<endl; - cout<<mem.allocate(5)<<endl; - cout<<mem.allocate(5)<<endl; + cout<<mem.allocate(5)<<endl;///0 + cout<<mem.allocate(2)<<endl;///5 + cout<<mem.allocate(3)<<endl;///7 + cout<<mem.allocate(5)<<endl;///10 cout<<mem; mem.free(5); + mem.free(10); + cout<<mem; + mem.free(7); cout<<mem; return 0; } diff --git a/NHF/src/heap.cpp b/NHF/src/heap.cpp index c29e9d8..283dfac 100644 --- a/NHF/src/heap.cpp +++ b/NHF/src/heap.cpp @@ -74,10 +74,29 @@ void heap::free(const memnum pid) /* * Meg kell vizsgálni, hogy a kettő közül melyik telítetlen, * majd a kiválasztott blokk legelejét beállítani egy new_empty_block_size értékére. + * + * "Jobbról balra" haladunk, mert így minden helyen csak egyszer kell vizsgálódni, + * utána pedig rögtön el lehet végezni a szükséges műveleteket is. */ + memnum new_empty_block_size=blocks[pid].block_size; + if(!blocks[after].filled) + { + //Ha az utána lévő blokk üres, akkor annak a méretét is hozzá kell adni az új mérethez + new_empty_block_size+=blocks[after].block_size; + //Mivel mostmár nem ez a byte lesz az új blokk első byte-ja , így resetelni kell. + blocks[after].reset(); + } if(!blocks[before].filled)//ha előtte is van üres memóroaterület { - + new_empty_block_size+=blocks[before].block_size; + //ha előtte is van új blokk, akkor az lesz az új egybefüggő blokk eleje, tehát a jelenlegi byte-ot resetelni kell + blocks[pid].reset(); + //most pedig az eredeti előtt lévő blokkot kell felparaméterezni az eddig számolt adatokkal + blocks[before].set(false,new_empty_block_size); + } + else//ez az az eset, amikor előtte BIZTOS NINCS, utána pedig vagy van vagy nincs üres blokk + { + blocks[pid].set(false,new_empty_block_size); } } -- GitLab