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
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
@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
So könnte es etwas Caching geben. Vielleicht werden beim Lesen der Knotendatei einige globale statische Variablen zugewiesen. – xMRi