在MFC程序中调用osg库显示数据,debug模式下程序运行结束后会出现大量的内存泄漏:
Detected memory leaks!
Dumping objects ->
{64344} normal block at 0x00000000052882D0, 8 bytes long.
Data: <0 ) > 30 07 29 05 00 00 00 00
{64343} normal block at 0x0000000005288320, 16 bytes long.
Data: <8 x > 38 F9 D5 05 00 00 00 00 78 F9 D5 05 00 00 00 00
{64341} normal block at 0x00000000061911A0, 24 bytes long.
Data: < ) > 80 91 29 05 00 00 00 00 F0 FF 20 02 00 00 00 00
{64306} normal block at 0x000000000528CA80, 16 bytes long.
Data: <X-D > 58 2D 44 05 00 00 00 00 00 00 00 00 00 00 00 00
{64305} normal block at 0x0000000005442D40, 208 bytes long.
Data: < x > E8 F6 78 DB FE 07 00 00 00 00 00 00 00 00 00 00
……
……
Object dump complete.
查阅相关资料发现可能是MFC在释放osgviewer的资源之前释放了自己的windows资源。解决办法参考:
https://www.cnblogs.com/lanzhi/archive/2010/06/27/6471029.html
一共包括四个步骤:
- 项目属性-常规-MFC的使用,选择使用标准windows库;
- 项目属性-常规-字符集:选择使用多字节字符集。需要注意的是更改字符集使用后,程序内部涉及字符串处理的部分代码可能需要修改。
- 项目属性-C/C+±预处理器,添加_AFXDLL配合12步使用;
- 项目属性-链接器-输入,添加mfc140d.lib和msvcrtd.lib,我使用的是vs2017所以添加mfc140。
按照上述步骤坐下来发现计算机无法识别mfc140d.lib,资料说需要用vs installer安装spectre库,但是vs2017 enterprise版的installer里并没有这个选项,于是安装了标准库模块。
再次运行成功。
这种办法可以解决在未调用osg进行显示的情况下的内存泄漏问题,但是在调用osg显示后关闭程序仍然会面临内存泄漏。
2020/9/8更新。原来内存泄漏是因为有一个对点云内的每一个点进行处理时都需要调用多次的进制转换函数,这个函数里new了字符串数组,却没有delete。修改这部分函数,问题解决。