一个“莫须有bug”的调试

惊现莫名bug

在C++中打算使用CreateFile创建一个文件,结果未创建成果,便在创建函数的结束括号出打了一个断点,竟然发现我的filepath居然是乱码,给一个CString类型赋值这么稀松平常的事居然出现乱码?!
赋值乱码

调试

既然乱码,首先想到的就是编码问题了,C++的宽字符、Unicode不同方式的编码到现在我也不是完全门儿清。尝试了"L","_T"以及其他的处理方式后,发现依然不行,内心一批又一批的羊驼在奔跑。
难道是电脑的问题,我想着等目前电脑上的事情处理完后重启下电脑或换台别的电脑试下,便暂且放下了。
冷静了几天之后依然不甘心,查看了另一个项目代码,确定在给CString赋值是没有问题的,即不是电脑的问题,还是代码哪里出了问题。对比了一下,突然想到是不是,我在这里使用了const限定函数。

BOOL  CFileManagement::BuildSampleFile(CString& filename) const

难道是因为此类函数中生成的变量无法赋初值,于是我将filepath变量声明于该函数的外部,结果发现居然可以了,难道时因为const限定的函数无法修改自己内部声明的局部变量?这不合理啊。
那么是我对这个const限定的函数的理解一直有问题吧,查了下stackflow,原来const限定的函数是不可以修改该类的变量(变量声明为mutable时除外)。
为了确定是否时const限定函数的原因,我将声明中的const的去掉了。

BOOL  CFileManagement::BuildSampleFile(CString& filename) 

发现依然不行。那么理论上是和const没有关系了。毕竟如果是const的原因的话,无法赋值时编译器时会报错的。
那么是返回值有问题?(真是病急乱投医),我将返回值类型改为void之后,返现居然也可以了,奇怪,想不通的原因啊。但是查看之前项目的代码,返回值是没影响的啊。到底是为啥呢。我在局部变量声明的地方打了个断点,单步调试,发现“咦?一切正常”,还在期待哪一步开始乱码,突然发现自己意识到了问题。根本就是自己打断点的问题!
断点位置
到了最后一个断点的位置的时候,局部变量已经销毁了,变量所指的内容当然会乱码了!
这样,回过头看的时候就清楚

  1. 在函数外部声明变量时没问题,是因为全局变量当然没问题了。
  2. 无返回值时,程序执行至最后半个括号时,依然在局部变量的作用域内;而有返回值时,在return之后,局部变量便失效了。
总结
  • 陷入了代码有问题的死角,没意识到自己断点设置的有问题,所以调试方法也时很重要的。
  • 心态不能崩。大多数问题都是自己的问题,而不是机器的问题。耐心去调。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值