心得体会

来源:互联网 发布:大数据 外贸 研修班 编辑:程序博客网 时间:2024/04/27 21:46

1. 编写程序时可能会碰到一些奇怪的问题,比如分离一个文件的二进制数据,分为左右两边,每一边用一组独立的变量,理论上是完全分离开了,但是程序运行的结果却显示数据有交叉,为此忙活了一天,但是还是没有找到问题的所在。最后发现把右边数据的代码或者左边数据的代码注释掉,程序却能正常运行。为什么会出现这样奇怪的现象呢?当我把注释代码从上到下慢慢释放时,发现是最后一个标记影响了程序的正常。我两边的数据标记都是分开的,但是为什么一个标记会有如此大的影响呢?静静地想,这个标记是用来为上边的代码服务的,我猜想问题的症候可能在上面,看看标记打开后哪些代码会运行,然后把那些代码注释掉,果然也不会出现交叉了。于是再分析注释掉的代码,最后发现是共用的一个函数出现了问题。函数的最后一个参数是代表左右的,而我在代码中全部写成了左边,所以会出现左右两边数据交叉那样奇怪的现象。安静

 

2. (MFC)最近碰到一个奇怪的问题,我调用别人编写的一个DLL,要使用里面的一个接口函数,接口参数全都正确。我在程序里头动态加载该DLL,然后获取该函数的地址。程序编译好以后,运行,从主窗口弹出一个窗口,该窗口后台调用那个DLL函数。第一次弹出子窗口运行正常,可是当我把子窗口关闭之后,再弹出来的时候,程序有些异常。我用VS自带的调试器调试了一下,发现两次调用该函数的时候,传入的参数都相同,可是函数的返回值却不相同。这个也太奇怪了。按理来说,同一个函数,相同的输入应该产生相同的输出啊!这是为什么呢?我以为是自己在函数外头动态分配的内存没有清理,可是清理之后还是出现异常。VS自带的调试器调试汇编码的时候不方便,于是我用OD调试了一下,花了半天的时间总算发现了真相。因为该函数里头使用了DLL一个全局变量,第一次弹出来之后就把该变量的值改变了,之后再次调用该函数 的时候,就按上次设置好的值来判断执行,所以会有异常出现。好了,问题的根源找到了,接下来怎么改呢,我选择用基址加偏移的方式获取那个变量,然后在第二次调用之前先将该变量置位,但是运行的时候出现了访问违规!看来是不能动态修改了,只能另辟蹊径了。灵光一闪,对!我可以选择卸载该DLL,再次动态加载就可以了!马上修改代码,编译,运行果然正常了!呵呵。。。

心得:有加载就有释放!有分配就有释放!在编程当中,不需要的时候要记得释放资源~奋斗

原创粉丝点击