[问题] C++ 变量无法正常创建

楼主: handofn0xus (你真是糟糕的小焰)   2024-07-10 16:52:46
在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了
作者: pigyuanncu   2024-07-10 17:52:00
请问你所谓的实际要用他是在循环外用还是循环内,就如你现在提供的程式码以及叙述,byWTF可能被编译器optomized out,所以你也找不到这个变量,但是你如果说你有实际存取这个变量,他应该就会存在于这个function call的stack memory里,但用debugger找不找得到该变量是另外一回事(取决于optimization level)
作者: james732 (好人超)   2024-07-10 18:03:00
release build会做最佳化,有些变量会消失掉
作者: pigyuanncu   2024-07-10 18:34:00
我觉得如果可以的话,看你要不要贴整段的程式码,感觉起来你的crash可能不是东西不见了,如果是东西不见了,最烂的workaround可能会是让东西都变成volatile,但程式可能就会变很慢
作者: firejox (Tangent)   2024-07-10 19:52:00
vbyRawData是放在哪里
作者: kdjf (我抓得到什么呢?)   2024-07-10 19:53:00
这样形式的变量变成直接存取/没给位置很正常啊,找个可以内存管理和安全性的框架找看看是不是踩未定义行为吧
作者: notBeing (read and be read)   2024-07-10 20:26:00
Breakpoint 打在210行 试看看能不能watch , 先简化问题试试
作者: ctrlbreak   2024-07-10 22:31:00
清专案重编看看 遇到过几次类似情况 也是release后发生
作者: firejox (Tangent)   2024-07-11 12:41:00
那如果把vbyRawData 用参数的方式会有同样的问题吗我要问的是vbyRawData的scope可能编译器认为 vbyRawData 都是0,然后有赋值的地方也看不到所以optimize时就不见了
作者: Dracarys (MayShowGunMore)   2024-07-11 21:01:00
有可能debug/release builds ABI incompatible 然后link错看不懂什么叫private全域变量,可以写个minimal reproducer放compiler explorer吗
作者: firejox (Tangent)   2024-07-11 21:28:00
全域变量的话 volatile 应该能解决
作者: wulouise (在线上!=在电脑前)   2024-07-11 22:34:00
这个变量会被optimized out的吧..只有loop内用不能watch很正常,要看的是实际上那边crash
作者: closer76 (克楼瑟)   2024-07-12 00:38:00
同意应该是被最佳化掉了,因为是从 vector 取出的,编译器可以直接算出资料所在位置。不过我另外有个问题:为什么要用 VS2008? XD
作者: ctrlbreak   2024-07-12 19:27:00
release版看不到正常, 不放心就输出一份asm档看看逻辑符不符合需求XD
作者: lc85301 (pomelocandy)   2024-07-12 22:38:00
看 asm 没必要吧,debug build 就可以了

Links booklink

Contact Us: admin [ a t ] ucptt.com