[問題] C++ 變數無法正常創建

看板C_and_CPP (C/C++)作者 (你真是糟糕的小焰)時間4月前 (2024/07/10 16:52), 3月前編輯推噓6(6028)
留言34則, 10人參與, 4月前最新討論串1/1
在Visual Studio 2008編寫MFC GUI時遇到一個莫名其妙的神奇問題 首先上圖: https://i.imgur.com/eGBVQ.jpeg
我在這個function創建一個變數byWTF 之前是別的名字,但我後來故意改一個沒用過的變數名稱保證這個名稱不可能被用過 然後實際在debug時,發現這個變數絕對不會被創建 導致後續出現一系列非預期錯誤 從圖中也能看到 byWTF早就被宣告 上一行執行也給他賦值了 但是把他Add watch就發現這個變數根本沒被放到記憶體 然後後面實際要用到他就直接閃退報錯了 所有其他變數都能正常宣告創建 就他跟我之後測試用建的所有變數都無法正常創建 我這邊到底是做錯了甚麼?真的毫無頭緒 更新: Debug build可以正常宣告, Release build就會出問題 240711 AM09:50更新: 我把整個release資料夾砍掉 再build 雖然byWTF依舊無法watch 但不會再出錯crash了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.130.45.59 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1720601570.A.BC6.html

07/10 17:52, 4月前 , 1F
請問你所謂的實際要用他是在迴圈外用還是迴圈內,就
07/10 17:52, 1F
最內層迴圈 有用在if判斷式 以及後續也會把這個值賦予給別的變數 這個變數沒被創建 導致我後續vector部分index會無法正常賦值 進而造成crash 我用Debug build跑就完全正常 但一用release build就會死在這

07/10 17:52, 4月前 , 2F
如你現在提供的程式碼以及敘述,byWTF可能被編譯器op
07/10 17:52, 2F

07/10 17:52, 4月前 , 3F
tomized out,所以你也找不到這個變數,但是你如果說
07/10 17:52, 3F

07/10 17:52, 4月前 , 4F
你有實際存取這個變數,他應該就會存在於這個functio
07/10 17:52, 4F

07/10 17:52, 4月前 , 5F
n call的stack memory裡,但用debugger找不找得到該
07/10 17:52, 5F

07/10 17:52, 4月前 , 6F
變數是另外一回事(取決於optimization level)
07/10 17:52, 6F

07/10 18:03, 4月前 , 7F
release build會做最佳化,有些變數會消失掉
07/10 18:03, 7F
但很顯然他把我一個必須用到的變數給最佳化掉了...

07/10 18:34, 4月前 , 8F
我覺得如果可以的話,看你要不要貼整段的程式碼,感
07/10 18:34, 8F
https://i.imgur.com/GDt2v.png
這邊是主要會用到byWTF的程式碼

07/10 18:34, 4月前 , 9F
覺起來你的crash可能不是東西不見了,如果是東西不見
07/10 18:34, 9F

07/10 18:34, 4月前 , 10F
了,最爛的workaround可能會是讓東西都變成volatile
07/10 18:34, 10F

07/10 18:34, 4月前 , 11F
,但程式可能就會變很慢
07/10 18:34, 11F

07/10 19:52, 4月前 , 12F
vbyRawData是放在哪裡
07/10 19:52, 12F
這個function進入前就會在別的function給值了 我在本文貼的那個斷點處也檢查過該vector裡確實有我預期的所有資料

07/10 19:53, 4月前 , 13F
這樣形式的變數變成直接存取/沒給位置很正常啊,找個可以記
07/10 19:53, 13F

07/10 19:53, 4月前 , 14F
憶體管理和安全性的框架找看看是不是踩未定義行為吧
07/10 19:53, 14F

07/10 20:26, 4月前 , 15F
Breakpoint 打在210行 試看看能不能watch , 先簡化問題
07/10 20:26, 15F

07/10 20:26, 4月前 , 16F
試試
07/10 20:26, 16F
有試過在那兩個vector初始化的下面那行加 byWTF = 0; 然而斷點設在210 用F10去跑每一行的時候 會直接跳過byWTF=0; 也watch不到東西(Symbol not found)

07/10 22:31, 4月前 , 17F
清專案重編看看 遇到過幾次類似情況 也是release後發生
07/10 22:31, 17F
好 我再試試看 感謝 == 更新:我把整個release資料夾砍掉 再build 雖然byWTF依舊無法watch 但不會再出錯crash了

07/11 12:41, 4月前 , 18F
那如果把vbyRawData 用參數的方式會有同樣的問題嗎
07/11 12:41, 18F
參數是指?

07/11 12:43, 4月前 , 19F
我要問的是vbyRawData的scope
07/11 12:43, 19F
該class的private全域變數 我是直接宣告在標頭擋的class裡的

07/11 12:49, 4月前 , 20F
可能編譯器認為 vbyRawData 都是0,然後有賦值的地方也
07/11 12:49, 20F

07/11 12:49, 4月前 , 21F
看不到所以optimize時就不見了
07/11 12:49, 21F

07/11 21:01, 4月前 , 22F
有可能debug/release builds ABI incompatible 然後lin
07/11 21:01, 22F

07/11 21:01, 4月前 , 23F
k錯
07/11 21:01, 23F

07/11 21:03, 4月前 , 24F
看不懂什麼叫private全域變數,可以寫個
07/11 21:03, 24F

07/11 21:03, 4月前 , 25F
minimal reproducer放compiler explorer嗎
07/11 21:03, 25F

07/11 21:28, 4月前 , 26F
全域變數的話 volatile 應該能解決
07/11 21:28, 26F

07/11 22:34, 4月前 , 27F
這個變數會被optimized out的吧..只有loop內用
07/11 22:34, 27F

07/11 22:35, 4月前 , 28F
不能watch很正常,要看的是實際上那邊crash
07/11 22:35, 28F

07/12 00:38, 4月前 , 29F
同意應該是被最佳化掉了,因為是從 vector 取出的,編譯
07/12 00:38, 29F

07/12 00:38, 4月前 , 30F
器可以直接算出資料所在位置。
07/12 00:38, 30F

07/12 00:38, 4月前 , 31F
不過我另外有個問題:為什麼要用 VS2008? XD
07/12 00:38, 31F

07/12 19:27, 4月前 , 32F
release版看不到正常, 不放心就輸出一份asm檔看看邏輯
07/12 19:27, 32F

07/12 19:27, 4月前 , 33F
符不符合需求XD
07/12 19:27, 33F

07/12 22:38, 4月前 , 34F
看 asm 沒必要吧,debug build 就可以了
07/12 22:38, 34F
※ 編輯: handofn0xus (42.72.7.15 臺灣), 07/26/2024 14:16:57
文章代碼(AID): #1cZalYl6 (C_and_CPP)
文章代碼(AID): #1cZalYl6 (C_and_CPP)