私の目標は、ライブラリ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
を定義しました。これはインテリジェントポインタです。
なぜメモリリークが発生し、この問題を解決できるのでしょうか?ここで
あなた「は、このコードをシールド」で何を意味するのですか? COSGEartchデストラクタが呼び出されていることを確認してください。 OSGコードがそれ以上のキャッシュを使用していないことは確かですか? _crtBreakAllocを使用して、そこに割り当てられているものを確認してください! – xMRi
@ xMRi。私はこの行 "m_Model = osgDB :: readNodeFile(m_strModelName);"を削除すると、メモリリークはもう発生しません。 COSGEartchデストラクタが呼び出されます。 – zalisc
キャッシュがあるかもしれません。おそらく、ノードファイルを読むことで、いくつかのグローバルな静的変数が割り当てられるかもしれません。 – xMRi