永发信息网

被Release版本搞疯了

答案:3  悬赏:0  手机版
解决时间 2021-05-14 12:02

花了很长时间写的一个软件,Debug版本一切正常,而最后Release版本莫名其妙的出了问题。

花了很长时间,终于把问题定位到如下代码段:

char buf[256] = "" ;
CString test;
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\预约系统助手",&hKey);
test.Format("%ld",GetLastError());//aaaaaaaa
MessageBox(test);//aaaaaa
RegQueryValueEx(hKey,"path",0,&dwtype,(LPBYTE)buf,&dwvalue);
GetLastError();//aaaaa
test.Format("%ld",GetLastError());//aaaaaa
MessageBox(test);//aaaaaaaaaaaa
m_path = buf;
MessageBox(buf);
/////////////
debug版本 buf的值一切正常,
release版本 为什么buf取不到注册表的值。。。。
GetLastError也是正常的。。。。

后来发现,我加了这些测试语句后居然正常了!也就是代码中注释为aaaaaaaa的代码,靠这是什么意思?根本没有影响啊,为什么加了就正常,没加buf就读不到注册表。。。

还有,当我把Release版本中“工程-设置-C++-优化”改为“最快”,那么如上代码段就一切正常,但是其他某个地方会出问题,我还没有定位到。所以现在我在“工程-设置-C++-优化”中是“默认”。。。。

神啊,帮帮我吧。。。


最佳答案
估计是跟内存分配有关。
debug时,会在对象后面留下空余空间,作为debug分析用。所以deubg与release的执行程序是不一样的。优化选项也有类似的作用。
比如,把某个语句优化到MessageBox(buf);之前,并且把buf的内存地址的内容干掉了(不是不可能)。
全部回答

我终于找到了问题所在,贴出来好给遇到同样问题的朋友一个参考。

关键是这句:

RegQueryValueEx(hKey,"path",0,&dwtype,(LPBYTE)buf,&dwvalue);

dwvalue未初始化而造成的。在DEBUG版本中,dwvalue会自动初始化为0xCCCCCCCC而在RELEASE版本中如果没有人工初始化那么dwvalue为0X0 RegQueryValueEx在工作时检查dwvalue发现内存长度不对,就不会工作,所以取不到值。解决方法:给dwvalue赋初值就OK。DWORD dwvalue = MAX_PATH.

看来养成良好的编程习惯还是很重要的。。。

你的m_path是个什么类型的变量 指针??
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
本机上不了网
沈丘县爱家乐私厨哪位知道具体地址啊
时光如梭的意思,时光荏苒 岁月如梭 是什么意
仓鼠咬人要紧吗?
穿肉色袜能晒黑皮肤吗
紧急咨询!!
哪位亲有SJ三巡赫海SOLO?
我想养殖一些有入药的昆虫,不知道有哪些昆虫
VS2008编译程序时出错,跳出提示窗口如下
祝福你我的祖国伴奏,伴奏的乐器和主奏乐器是
嵩县大北农养殖服务部(嵩县店)在什么地方啊,
22岁还可以做窿鼻手术麽
南昌大学入学数学英语考试难不难?
怎么除蟑螂!!!!
怎么修庄园啊
推荐资讯
杭州地区梦幻号换个地下城号
无线网卡多少一个月?
QQ密码被人知道了把我队转了怎么办
结婚要找结婚顾问,投资要找投资顾问,那么顾
索爱580酒红色和粉红色哪个好?
天门市富丽小招哪位知道具体地址啊
还会回来的句子,形容遇见的诗句
武林里面怎么卡时间
Q币起凡会员
如何清洗全自动洗衣机,小天鹅全自动洗衣机怎
一段难舍的情感
CF刀锋多少钱
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?