我有一個自動生成的檔案來創建結構并用它們進行一些計算。每個結構都有其專用范圍。
typedef struct
{
uint16_t a;
uint16_t b;
} Addition_t;
uint8_t StructsOverflow(void)
{
{ // use new scope to declare same variable multiple times
Addition_t x = {.a = 5, .b=6};
if (x.a == x.b)
return 1;
}
{
Addition_t x = {.a = 3, .b=6};
if (x.a == x.b)
return 1;
}
{
Addition_t x = {.a = 3, .b=5};
if (x.a == x.b)
return 1;
}
// and so on
// here other structs are created in the same fashion as above
return 0;
}
對于大量的行(大約 100,000 個結構),運行 .exe 會以 StackOverflow: 停止Exception thrown at 0x00007FF7F2C8B6C8 in EnergyPredictionMain.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000001815603000).。
我使用 MSVC 2019 編譯器和 cppvsdbg 進行除錯。
為什么會有堆疊溢位?據我了解,變數在作用域之后被銷毀,因此只應使用一個結構的記憶體。
uj5u.com熱心網友回復:
為什么?因為,在除錯版本 (IIRC) 中,當區域變數以這種方式超出范圍時,MSVC 不會釋放它們。在發布版本中,它可能會起作用。
但是,IMO,這里真正出問題的是自動生成該檔案的內容。將其更改為生成 100,000 個單獨的子函式,每個子函式初始化(然后處理)一個結構是否可行?然后從(也是自動生成的)“主”函式依次呼叫它們中的每一個。
如果你能做到這一點,它應該提供一個強大且面向未來的修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477693.html
上一篇:使用二維陣列計算每個字串中的元音
下一篇:sin函式頻率突然跳躍
