diff --git a/NHF/main.cpp b/NHF/main.cpp index 5cfadafb11994c8abc3bcf0bb107417707ab86c8..efa44ac7cbb760c7e49a32c7af51b872d6d32d9e 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 c29e9d8f61042f86c3c10ad614a8a84c94fb4590..283dfacd36527fc644d8cf9fcdd831953c0f2265 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); } }