我有一個龐大的遞回函式,它可以根據用戶的輸入輕松地溢位系統,我想知道是否有辦法在運行期間檢測你是否即將耗盡呼叫堆疊的空間。有什么方法可以檢查我是否要炸毀堆疊,以便在即將炸毀時終止/做其他事情?
uj5u.com熱心網友回復:
有些情況下,我們更喜歡使用遞回函式。然而,如果遞回函式在某些環境中走得太深,例如在Visual C 代碼中,可能會出現不希望出現的結果,例如堆疊溢位。與你的一樣,為了這個目的,我們把遞回函式轉換成帶堆疊的while-loop。你可以檢查實作這里
事實上,沒有通用的方法來檢測系統的堆疊大小,因為每一個編譯器都有不同的堆疊大小,其中一些編譯器的堆疊大小可以調節。
你可以按以下方式檢查不同的大小:
你可以按以下方式檢查不同的大小。
glibc i386, x86_64: 7.4 MB
Tru64 5.1: 5.2 MB
Cygwin。1.8 MB
Solaris 7..10: 1 MB
MacOS X 10.5: 460 KB
AIX 5: 98 KB
OpenBSD 4.0: 64 KB
HP-UX 11: 16 KB
因為它是運行時錯誤,所以你也不能用try-catch陳述句來捕捉,但你可以實作預防邏輯。
#include <stdio.h>/span>
//這些將被設定在main()的頂部。
static char * _topOfStack。
static int _maxAllowedStackUsage;
int GetCurrentStackSize()
{
char localVar;
int curStackSize = (&localVar)-_topOfStack;
if (curStackSize < 0) curStackSize = -curStackSize; //以防堆疊向下增長。
return curStackSize。
}
void MyRecursiveFunction()
{
int curStackSize = GetCurrentStackSize()。
printf("MyRecursiveFunction: curStackSize=%i
", curStackSize)。)
if (curStackSize < _maxAllowedStackUsage) MyRecursiveFunction()。
else[/span
{
printf(" Can't recurse any more, the stack is too big!
")。)
}
}
int main(int, char **) /span>
{
char topOfStack;
_topOfStack = &topOfStack;
_maxAllowedStackUsage = 4096; // or whatever amount you feel comfortable allowing。
MyRecursiveFunction()。
return 0;
uj5u.com熱心網友回復:
有什么方法可以在運行時檢測到堆疊溢位嗎?(c )
沒有標準的方法來知道有多少堆疊空間可用,也沒有標準的方法來知道有多少堆疊被消耗了,更沒有標準的方法來知道一個函式呼叫會消耗多少堆疊。
總之。沒有標準的方法來檢測潛在的堆疊溢位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/319289.html
標籤:
