iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
1
自我挑戰組

30 Days 如何把 C 語言偽裝成高階語言 OWO /系列 第 14

Days 14: 垃圾回收器系列:完善 用於釋放所有被標記地址的函數

▌第一次閱讀本系列的,可以先看:

本系列的大綱 傳送門


▌第一次閱讀垃圾回收器系列,可以先看:

垃圾回收器系列 開始第一篇 傳送門


▌前言提要:

有這幾個函數:

void free_all_register_address(void);               // 釋放
void register_address(void *address);               // 標記
void new_1d(void **ptr, int length, int type_side); // 分配

分別進行釋放標記分配的工作。

還有用於紀錄地址全域變數

void **address_pool = NULL;  //將會是一個動態陣列,儲存 void*
int index = 0; //索引,指向目前可以儲存地址的空間

標記分配在前兩篇文章已經進行了初步的構思完善
詳細的部分可以回去看。

所以今天要完善的是用於釋放所有被標記地址的函數,
free_all_register_address


▌完善釋放所有被標記地址的函數:

假設所有需要釋放的地址已經經 register_address() 函數註冊、標記,
所以要釋放所有被標記地址只需要遍歷一次 address_pool


▌粗略估計 free_all_register_address 的結構:

void free_all_register_address(void) {

	/*遍歷 address_pool 的空間*/
	for (int i = 0; i < index; i++) {
		free(address_pool[i]);  //釋放曾經記錄過的記憶體地址的空間
		address_pool[i] = NULL;
	}

    /*釋放用於紀錄的空間*/
	free(address_pool);
	address_pool = NULL;
}

很簡單,兩個部分,
就是遍歷 address_pool ,釋放。
再釋放用於記錄的空間。

釋放後設為 NULL 是為了安全,原因不多說。


最核心基礎的三個部分已經完成,明天來進行測試程式。


上一篇
Days 13: 垃圾回收器系列:完善 用於標記地址的函數
下一篇
Days 15: 垃圾回收器系列:初步測試
系列文
30 Days 如何把 C 語言偽裝成高階語言 OWO /31

尚未有邦友留言

立即登入留言