2017-12-04 9 views
0

Mein Ziel ist die Verwendung der Bibliothek OSGEarth, um ein MFC-Projekt zu erstellen, das das Modell "openstreetmap.earth" anzeigen kann. Ich beendete das und kann die Erde sehen. Aber jedes Mal, wenn ich das Projekt schließe, sagt das Ausgabefenster in vs2015, dass es Speicherlecks im Programm gibt. HierSpeicherleck in osgearth

ist das Fenster Ausgabe:

Detected memory leaks! 
Dumping objects -> 
{306240} normal block at 0x00000000076902F0, 16 bytes long. 
Data: <0,i    > 30 2C 69 07 00 00 00 00 00 00 00 00 00 00 00 00 
{306239} normal block at 0x0000000007692C30, 9 bytes long. 
Data: <Pragma: > 50 72 61 67 6D 61 3A 20 00 
{303648} normal block at 0x0000000007693040, 16 bytes long. 
Data: < 5i    > 90 35 69 07 00 00 00 00 00 00 00 00 00 00 00 00 
{303647} normal block at 0x0000000007693590, 9 bytes long. 
Data: <Pragma: > 50 72 61 67 6D 61 3A 20 00 
{301180} normal block at 0x00000000076938B0, 16 bytes long. 
Data: <`8i    > 60 38 69 07 00 00 00 00 00 00 00 00 00 00 00 00 
{301179} normal block at 0x0000000007693860, 9 bytes long. 
Data: <Pragma: > 50 72 61 67 6D 61 3A 20 00 
{297799} normal block at 0x0000000007691060, 16 bytes long. 
Data: < i    > 10 10 69 07 00 00 00 00 00 00 00 00 00 00 00 00 

ich das Programm untersucht und festgestellt, dass, wenn ich diesen Code löschen m_Model = osgDB::readNodeFile(m_strModelName); gibt es nicht mehr Speicherlecks.

void COSGEarth::InitSceneGraph(void) 
{ 
    // Init the main Root Node/Group 
    m_Root = new osg::Group; 
    // Load the Model from the model name, 
    //delete below line, no memory leak 
    m_Model = osgDB::readNodeFile(m_strModelName); 
    if (!m_Model) return; 

    // Optimize the model 
    osgUtil::Optimizer optimizer; 
    optimizer.optimize(m_Model.get()); 
    optimizer.reset(); 

    // Add the model to the scene 
    m_Root->addChild(m_Model.get()); 

}

I definiert m_Model als osg::ref_ptr<osg::Node> m_Model. Dies ist ein intelligenter Zeiger.

Warum gibt es Speicherlecks und wie kann ich dieses Problem lösen?

Hier Quellcode: http://bbs.osgchina.org/forum.php?mod=attachment&aid=NzIwNnwzZWYxZDIyZjlhOGY1MWFjZjhiNGFiMWYwMTc5YmJlNXwxNTEyMzc5ODE2&request=yes&_f=.zip

+0

Was meinst du mit ‚abschirmen diesen Code‘? Sicher, dass der COSGEartch-Destruktor aufgerufen wird. Sicher, dass der OSG-Code kein weiteres Caching verwendet? Verwenden Sie _crtBreakAlloc, um zu überprüfen, was dort zugewiesen ist! – xMRi

+0

@xMRi. Ich meine, wenn ich diese Zeile lösche "m_Model = osgDB :: readNodeFile (m_strModelName);", wo ist kein Speicherlecks mehr. COSGEartch-Destruktor wird aufgerufen. – zalisc

+0

So könnte es etwas Caching geben. Vielleicht werden beim Lesen der Knotendatei einige globale statische Variablen zugewiesen. – xMRi

Antwort