今天在VS2008中发现了超级令人抓狂的问题,经试验发现在VS2010中有同样的问题存在。
重现问题——
在VS2008中新建C++的“win32控制台应用程序”项目,并添加对MFC类库的引用。
在_tmain函数前加上如图所示的注释,然后在主函数中随便写上几句代码,并设置断点,整个代码如图。
最后在debug模式下,按F5运行,结果,程度在第二个断点处没有停住,而是直接运行过去!!
经过反复的试验——包括删除ncb文件,重启VS,重启电脑……忽然想到《Exceptional C++ Style》中有提到注释可能对代码产生影响,比如 “//?” 会被转换成 “\”,结果使第二行代码失效了!!
难道这里也是因为注释的问题?于是将_tmain()前的注释去掉后,果然,断点的功能居然又回来了!!
注释掉的代码也会对程序的调试产生影响!!为了弄明白这个问题,本人接下来查看了其生成的汇编代码——即程序运行到第一个断点处时,调出反汇编窗口,如图
明明是好好的一段注释代码,但微软的VS编译器,硬是在其中加了一堆代码。本人现在才开始学win32下的汇编,只知道ebp,esp是用在函数调用时传递参数用的。
在已经被注释掉的代码却生成了目标代码,虽然没有对程序的结果造成直接影响(该执行的地方都正常运行了,上面的程序可以正常输出1),但不能在调试时查看断点,最令人揪心的是不知这些多余的代码何时会产生更大的影响。并且发现对已经注释掉的结构体里的内容进行修改后(比如添加或减少几个字段的申明),也会影响代码的生成……
当本人花了几个小时找出这个问题后,心情依然沉重,结果是现在不敢在VC++中使用 // 风格的注释了(上面的注释掉成/* */后就没问题),并且尝试了其它可能出现问题的情况。
最后,自己重新建立项目,并且所有的代码都自己敲上去,发现一切OK。原来~~原来,上面那段注释过的代码是同事用QQ发给我的!!!!而QQ对话框中的换行和VS中的转行编码不一样,于是就出现了上面这种注释掉的代码会对程序产生影响的情况~~ QQ~~
本人在工作上使用C/C++一年多的时间了,对C++的内存泄漏有着一些自己的看法。
用普通方式new出来的内存,用boost的shared_ptr智能指针可以说很好的完成。而二维、多维数组,boost也有提供支持,而本人的TwoDimesionArray<T> 也提供了很好的实现。
可对于一些隐式的申请资源,却没有比较的解决方案。比如MFC中的创建的句柄得释放,用fopen打球的文件指针得释放,openCV中用cvCreateImage创建的图像得释放。这时就不能用MFC的智能检测工具,或者boundscheck之类的工具帮助我们了。
现在,个人觉得对于这种情况,最好的方法就是在源代码级别进行代码分析,找出那些只有"create",而没有"release"的代码。
这就得实现一个简单的C++编译系统,不过现在应该有比如成熟的方法或者库来进行这个工作。就把这个项目放入自己“待实现的程序”这一栏中吧~~