QtCreatorとValgrindを使用して、Qtプログラムのメモリリークをチェックしています。次のように、デストラクタのQHashのいくつかのエントリを削除しています。
QHash<QString, QVariant*> m_Hash;
/**
* @brief
* Destruct a Foo Class instance
*/
Foo ::~Foo ()
{
// Do Cleanup here
// Delete hash leftovers
foreach( QString key, m_Hash.keys() )
{
qDebug() << "Deleting an entry..";
// Delete the hash item
delete m_Hash.take(key);
}
}
Valgrindでデバッグする場合、このコードは問題なく、デストラクタが呼び出されたときに内容を削除します。
>> Deleting an entry..
>> Deleting an entry..
QtCreator内でGDBを使用して起動する場合、QtCreatorからGDBを使用せずに起動する場合、またはコマンドラインからQtアプリを実行する場合、セグメンテーション違反が発生します。
Signal name :
SIGSEGV
Signal meaning :
Segmentation fault
'delete'行を称賛すると、どの方法でもアプリを正常に実行できますが、メモリがリークします。
何が得られますか?valgrindは、デストラクタが機能するための何らかの遅延をもたらしますか?どうすればこれを解決できますか?