iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0
自我挑戰組

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

Days 15: 垃圾回收器系列:初步測試

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

本系列的大綱 傳送門


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

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


▌前文提要:

釋放標記分配的部分已經初步實現。
所以今天来測試一下 ~

釋放、標記、分配部分的代碼整合了,
很長所以放在了下一篇文章。


▌以下有兩項測試:

  1. free_all_register_address 有沒有生效
  2. 分配的空間的長度是否正常?

▌測試用主程序(1):

int main() {

    /*空間載體*/
	int *ptr;
    
    /*動態建立了空間*/
	new_1d(&ptr, 3, sizeof(int));
    
    /*賦值*/
	ptr[0] = 2;
	ptr[1] = 5;
	ptr[2] = 8;
    
    /*遍歷列印*/
	for (int i = 0; i < 3; i++) {
		printf("%d ", ptr[i]);
	}
    
    /*觸發雙重釋放 (double free) */
    free(ptr);
    
	system("pause");
	return 0;
}

先廢話說一下幹了什麼,你可以直接跳到下面的測試目的


有一個命名為 ptr 的指標,透過 new_1d 動態建立了空間。
空間共有 3*sizeof(int) = 3*4 = 12 字節。
按照 ptr 的類型 ( int* ) ,以每 sizeof(int) 個字節 切割/分為 一格,
所以共 3 格 , int 類型。

很囉嗦...,不過這是比較具體、詳細的情況,下一次就不用這樣的方式說了。

然後對 ptr 的空間賦值,因為連續空間已分配,這時候可以當陣列看待。
遍歷列印驗證結果,再加一個 free(ptr); 去觸發雙重釋放。

暫停,回傳 0 ,結束主程序。
然後觸發 free_all_register_address


▌測試目的:

先測試有沒有自動釋放了地址,
free_all_register_address 有沒有被運行。

如果 free_all_register_address 沒有生效
就會造成內存洩漏,所以先在主程序中放了 free(ptr);
即使沒有生效也不用擔心,不會內存洩漏
如果生效了就會造成雙重釋放 ( double free ) ,證實生效

▌測試結果:

輸出:

2 5 8 Press any key to continue . . .

成功在 free_all_register_address 觸發中斷點,發生錯誤。
https://ithelp.ithome.com.tw/upload/images/20181030/20111788uRVHvJ6Xnz.png
因為該空間已被釋放,沒有權限, free(ptr); 讀取存取違規。
https://ithelp.ithome.com.tw/upload/images/20181030/20111788B7b9Dtw3th.png
證實 free_all_register_address 有生效,
並且進行了釋放的動作。


▌測試用主程序(2):

int main() {

    /*空間載體*/
	int *ptr;
    
    /*動態建立了空間*/
	new_1d(&ptr, 3, sizeof(int));
    
    /*賦值*/
	ptr[0] = 2;
	ptr[1] = 5;
	ptr[2] = 8;
    ptr[3] = 11;
    
    /*遍歷列印*/
	for (int i = 0; i < 4; i++) {
		printf("%d ", ptr[i]);
	}
    
	system("pause");
	return 0;
}

跟上面差不多,只是來測試數組越界,賦值了 ptr[3]
目的是確認分配的空間長度正常

▌測試結果:

輸出:

2 5 8 11 Press any key to continue . . .

可以賦值和讀取,但這不代表什麼...。
https://ithelp.ithome.com.tw/upload/images/20181030/20111788vNqSqAqywV.png
又成功觸發中斷點了。

去除 ptr[3] = 11; 和修改為 i < 3 後正常運作,
證明分配的空間長度應該正常


說“應該正常”是因為我也不是完全融會貫通指標的,
說不定出錯了我也不知道,有疑問、問題或者錯誤歡迎提出~~~


▌大體上可以運作,不過這就是終點嗎?不是哦~

我們還有一些問題要處理,像是全域變數之類的,
還可以進行代碼重構,完善所有功能,
巨集增加效率,簡化代碼量。


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

尚未有邦友留言

立即登入留言