2017-12-04 9 views
0

私の目標は、ライブラリOSGEarthを使用して、モデル "openstreetmap.earth"を表示できるMFCプロジェクトを作成することです。私はこれを終了し、地球を見ることができます。しかし、私がプロジェクトを閉じるたびに、vs2015の出力ウィンドウには、プログラムにメモリリークがあると言われています。ここでosgearthのメモリリーク

がウィンドウの出力です:

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 

私はプログラムを検査し、私はこのコードm_Model = osgDB::readNodeFile(m_strModelName);を削除すると、それ以上のメモリリークがないことがわかりました。

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はosg::ref_ptr<osg::Node> m_Modelとしてm_Modelを定義しました。これはインテリジェントポインタです。

なぜメモリリークが発生し、この問題を解決できるのでしょうか?ここで

は、ソースコードである:http://bbs.osgchina.org/forum.php?mod=attachment&aid=NzIwNnwzZWYxZDIyZjlhOGY1MWFjZjhiNGFiMWYwMTc5YmJlNXwxNTEyMzc5ODE2&request=yes&_f=.zip

+0

あなた「は、このコードをシールド」で何を意味するのですか? COSGEartchデストラクタが呼び出されていることを確認してください。 OSGコードがそれ以上のキャッシュを使用していないことは確かですか? _crtBreakAllocを使用して、そこに割り当てられているものを確認してください! – xMRi

+0

@ xMRi。私はこの行 "m_Model = osgDB :: readNodeFile(m_strModelName);"を削除すると、メモリリークはもう発生しません。 COSGEartchデストラクタが呼び出されます。 – zalisc

+0

キャッシュがあるかもしれません。おそらく、ノードファイルを読むことで、いくつかのグローバルな静的変数が割り当てられるかもしれません。 – xMRi

答えて