在MFC框架下使用osg报内存泄露的解决办法

    这个问题其实是mfc的一种误报,osg有自己的内存管理方式,但是mfc不知道,
  MFC自作主张的认为发生了内存泄露,实际上内存并不是没有释放,osg的内存引用释放是在VC报内存泄露之后释放,内存泄露:CrtDumpMemoryLeaks()是在mfc71d.dll(8.0,9.0同样)卸载时被调用的,如果这个时候osgd.dll还没有卸载,那么在osg中new的全局变量也就还没有释放,所以MFC会认为产生了内存泄露。

    经过多次尝试,只要在工程属性---链接器---输入---附加依赖项中最前面添加mfc100d.lib即可。但是需要注意的是,当项目使用Unicode字符集时,需要添加的是mfc100ud.lib,否则程序会出现运行时的链接错误。

我测试过,在附加依赖项中的第一行加入mfc100d.lib 和mfcm100d.lib

     早上起来,想到了一个测试办法,就是建一个单文档程序,采用unicode字符集编译,附加库添加mfc100ud.lib,发现也会出现error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup的错误,但采用多字节字符集没有问题。看来并不是osg库的问题。(这是因为没有在共享DLL中使用MFC)。不要听网上的将其改为使用标准Windows库。

    我原来测试osg封装成dll给工程使用后,还是会有内存泄露。但其实确实是我没有释放osgViewer内存,因为void* m_osgInternal,如果直接delete m_osgInternal时是不会进入CXJOSGViewInternal的析构函数中的,只有delete (CXJOSGViewInternal*)m_osgInternal,才能真正进入析构函数,并释放osg内存。如果上面操作正确后,关闭程序还是有大量的OSG内存泄露,那就需要在工程的链接库中包含mfc100d.lib了。

你可能感兴趣的:(OSG)