由于历史原因,某软件项目的界面采用QT,而后台用了VC,界面静态调用了VC生成的dll,一直以来都能够快乐的合作,然而最近出现两个小问题,觉得两者之间的合作并没有想象的那么美好。
- 在VC下用多媒体定时器设计了一个10毫秒的定时器任务,由于某些原因在任务里加入了一个20毫秒的休眠(Sleep),这里不去深究设计的合理性,总之做了这么个设计,接着影响来了,QT界面的所有菜单(包括菜单栏菜单和右键菜单)都不能正常显示,仅能显示空白的菜单框,虽然框的大小并没有变化,但菜单项消失了,别的地方并没有什么异常,反复验证,两者存在绝对的因果关系,将定时器内的休眠去掉菜单项又恢复了,这里定时器的使用上虽然不合理,但难以理解为什么会影响菜单的绘制。
-
在VC下某类成员函数中将NEW出来的某对象赋给临时指针变量,经若干操作将该指针传递给该类的成员指针,其操作过程造成了界面使用QVector容器类过程中,特定的某次申请(malloc)容器空间失败(QT库内部的操作),而去掉临时指针变量,将对象指针直接赋给成员指针,软件顺利运行。通常malloc失败有两个原因,一是进程可支配的连续内存空间不足,二是操作越界,前者经检查不存在,那就是后者了,但很难理解临时的指针变量是怎样影响malloc操作的。
上述问题,如果深挖,一定是大坑,但意义不大。不过还是从中得到了点经验:当标准库运行异常,而又难以证明库本身质量问题的情况下,回顾一下编程过程,界定是哪个步骤导致了异常,分析这个步骤,不妨做些改动和调整。