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