Skip to content
Snippets Groups Projects
Commit c8747ca2 authored by Eckl, Máté's avatar Eckl, Máté
Browse files

A free() elméletileg jól működik, a jelenlegi main.cpp elvileg minden...

A free() elméletileg jól működik, a jelenlegi main.cpp elvileg minden gyengeségét kipróbálja, és ezekre helyes kimenetet ad.
parent e111975e
No related branches found
No related tags found
No related merge requests found
...@@ -9,11 +9,15 @@ int main() ...@@ -9,11 +9,15 @@ int main()
{ {
heap mem(20); heap mem(20);
cout<<mem; cout<<mem;
cout<<mem.allocate(5)<<endl; cout<<mem.allocate(5)<<endl;///0
cout<<mem.allocate(5)<<endl; cout<<mem.allocate(2)<<endl;///5
cout<<mem.allocate(5)<<endl; cout<<mem.allocate(3)<<endl;///7
cout<<mem.allocate(5)<<endl;///10
cout<<mem; cout<<mem;
mem.free(5); mem.free(5);
mem.free(10);
cout<<mem;
mem.free(7);
cout<<mem; cout<<mem;
return 0; return 0;
} }
...@@ -74,10 +74,29 @@ void heap::free(const memnum pid) ...@@ -74,10 +74,29 @@ void heap::free(const memnum pid)
/* /*
* Meg kell vizsgálni, hogy a kettő közül melyik telítetlen, * 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. * 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 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);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment