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


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


▌前文提要:

釋放標記分配的部分已經初步實現。
所以今天来測試一下 ~
釋放、標記、分配部分的代碼整合了,
很長所以放在了下一篇文章。

▌以下有兩項測試:

  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 後正常運作,
證明分配的空間長度應該正常

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

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

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