解决MFC使用osg内存泄漏问题

在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
一共包括四个步骤:

  1. 项目属性-常规-MFC的使用,选择使用标准windows库;
  2. 项目属性-常规-字符集:选择使用多字节字符集。需要注意的是更改字符集使用后,程序内部涉及字符串处理的部分代码可能需要修改。
  3. 项目属性-C/C+±预处理器,添加_AFXDLL配合12步使用;
  4. 项目属性-链接器-输入,添加mfc140d.lib和msvcrtd.lib,我使用的是vs2017所以添加mfc140。

按照上述步骤坐下来发现计算机无法识别mfc140d.lib,资料说需要用vs installer安装spectre库,但是vs2017 enterprise版的installer里并没有这个选项,于是安装了标准库模块。
在这里插入图片描述
再次运行成功。
这种办法可以解决在未调用osg进行显示的情况下的内存泄漏问题,但是在调用osg显示后关闭程序仍然会面临内存泄漏。
2020/9/8更新。原来内存泄漏是因为有一个对点云内的每一个点进行处理时都需要调用多次的进制转换函数,这个函数里new了字符串数组,却没有delete。修改这部分函数,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值