菜鸟最近浅尝win32,觉得还是找个地方记录下遇到的问题,养成一个良好习惯。
话说要弄一个用gdi+的小玩意儿,于是在头文件中定义了这么一个变量,用来存储显示器每毫米的像素数。
const unsigned nPixelPerMillimeter = GetDeviceCaps(GetDC(NULL), HORZRES) / GetDeviceCaps(GetDC(NULL), HORZSIZE);
接下来定义了一个自定义类的全局对象a,构造中使用了这个nPixelPerMillimeter,然后就悲剧了。vs不报错,然后编译运行的时候程序窗口出不来,而内存占用一直在攀升,并且这个问题不是必然发生,有一定机率看脸能运行。找到罪魁祸首之后思虑一番,应该是运行期a和nPixelPerMillimeter的初始化先后顺序无法保证,至于为何出现内存泄漏就不得而知;
最后解决办法是将全局对象改为指针,并在窗口的WM_CREATE消息处理函数中用new来构造。
补充:正好看到effective c++中第四条,“C++对定义于不同编译单元内的non-local-static对象的初始化顺序并无明确定义”