▌第一次閱讀本系列的,可以先看:
▌第一次閱讀垃圾回收器系列,可以先看:
▌前文提要:
釋放、標記、分配的部分已經初步實現。
所以今天来測試一下 ~
所以今天来測試一下 ~
▌以下有兩項測試:
free_all_register_address
有沒有生效?
- 分配的空間的長度是否正常?
free_all_register_address
有沒有生效?▌測試用主程序(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
。
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
類型。遍歷列印驗證結果,再加一個
free(ptr);
去觸發雙重釋放。然後觸發
free_all_register_address
。▌測試目的:
先測試有沒有自動釋放了地址,
即 free_all_register_address
有沒有被運行。
如果 free_all_register_address
沒有生效,
就會造成內存洩漏,所以先在主程序中放了 free(ptr);
,
即使沒有生效也不用擔心,不會內存洩漏,
如果生效了就會造成雙重釋放 ( double free ) ,證實生效。
即
free_all_register_address
有沒有被運行。free_all_register_address
沒有生效,就會造成內存洩漏,所以先在主程序中放了
free(ptr);
,即使沒有生效也不用擔心,不會內存洩漏,
如果生效了就會造成雙重釋放 ( double free ) ,證實生效。
▌測試結果:
輸出:
2 5 8 Press any key to continue . . .
成功在 free_all_register_address
觸發中斷點,發生錯誤。
因為該空間已被釋放,沒有權限, free(ptr);
讀取存取違規。
證實 free_all_register_address
有生效,
並且進行了釋放的動作。
2 5 8 Press any key to continue . . .
free_all_register_address
觸發中斷點,發生錯誤。因為該空間已被釋放,沒有權限,
free(ptr);
讀取存取違規。證實
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]
,
目的是確認分配的空間長度正常。
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 . . .
可以賦值和讀取,但這不代表什麼...。
又成功觸發中斷點了。
去除 ptr[3] = 11;
和修改為 i < 3
後正常運作,
證明分配的空間長度應該正常。
說“應該正常”是因為我也不是完全融會貫通指標的,
說不定出錯了我也不知道,有疑問、問題或者錯誤歡迎提出~~~
2 5 8 11 Press any key to continue . . .
又成功觸發中斷點了。
ptr[3] = 11;
和修改為 i < 3
後正常運作,證明分配的空間長度應該正常。
說不定出錯了我也不知道,有疑問、問題或者錯誤歡迎提出~~~
▌大體上可以運作,不過這就是終點嗎?不是哦~
我們還有一些問題要處理,像是全域變數之類的,
還可以進行代碼重構,完善所有功能,
用巨集增加效率,簡化代碼量。
還可以進行代碼重構,完善所有功能,
用巨集增加效率,簡化代碼量。
0 Comments
發佈留言