84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
#include <assert.h> #include <cstdio> int main() { int a = 1; assert(a < 1 && "wrong here"); printf("come here\n"); int b = 2; return 0; }
代码如上。。请问在一段程序中,如果中途使用assert(),然后程序直接中断了,那么在assert后面的那些变量是怎么清理的哦?
欢迎选择我的课程,让我们一起见证您的进步~~
沒清理, assert其實沒有回傳,程式立刻就中斷了. 程式中斷後, 作業系統回收了這個行程的所有資源. 在作業系統的嚴重, 並不能分辨出來a和"wrong here"到底是什麼東西, 無非是一塊記憶體而已.
函數內的變數都是局部變量,變數的記憶體是在堆疊上分配的,對於a,b來講,變數的記憶體就是一開始分配好的,如果從main函數正常退出,那麼就正常釋放,如果直接異常退出,也就沒有清理的必要了。 。 可以看看exit,return等函數退出程式的差異。 。
a,b
main
exit,return
如果中途使用assert(),然後程式直接中斷了,那麼在assert後面的那些變數是怎麼清理的哦?
由作業系統直接回收這個程式所使用的記憶體。
沒清理, assert其實沒有回傳,程式立刻就中斷了. 程式中斷後, 作業系統回收了這個行程的所有資源. 在作業系統的嚴重, 並不能分辨出來a和"wrong here"到底是什麼東西, 無非是一塊記憶體而已.
函數內的變數都是局部變量,變數的記憶體是在堆疊上分配的,對於
a,b
來講,變數的記憶體就是一開始分配好的,如果從main
函數正常退出,那麼就正常釋放,如果直接異常退出,也就沒有清理的必要了。 。可以看看
exit,return
等函數退出程式的差異。 。由作業系統直接回收這個程式所使用的記憶體。