Qt + VC++
d:id:youandi:20120110:p1
なんかQtのプログラムをメンテしていて、メモリーリークのチェックしたら大変な事になった。
プロジェクトを新規作成して、QTextCodecの行及びメモリーリーク検出用のコードを追加しただけのプログラムを実行すると・・・。
#include "stdafx.h" #include "testqtapp2.h" #include <QtGui/QApplication> #include <vld.h> // Visual Leak Debuger #include <crtdbg.h> // _CrtSetDbgFlag int main(int argc, char *argv[]) { ::_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); QApplication a( argc, argv ); #if 1 QTextCodec::setCodecForLocale( QTextCodec::codecForName( "Shift-JIS" ) ); QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "Shift-JIS" ) ); #endif TestQtApp2 w; w.show(); return a.exec(); }
Visual Leak Detector for Visual C++ 2008/2010のチェック結果。
No memory leaks detected. Visual Leak Detector is now exiting.
Win32APIの_CrtSetDbgFlagのチェック結果。
Detected memory leaks! Dumping objects -> {13974} normal block at 0x022C2418, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13973} normal block at 0x022623E0, 4 bytes long. Data: < $, > 18 24 2C 02 {13946} normal block at 0x022C3440, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13945} normal block at 0x022639D0, 4 bytes long. Data: <@4, > 40 34 2C 02 {13743} normal block at 0x022C5000, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13742} normal block at 0x022C4FC0, 4 bytes long. Data: < P, > 00 50 2C 02 {13720} normal block at 0x022C4A60, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13719} normal block at 0x02267D90, 4 bytes long. Data: <`J, > 60 4A 2C 02 {13705} normal block at 0x022C15E8, 24 bytes long. Data: < > 01 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 {13663} normal block at 0x022C40C0, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13662} normal block at 0x022C4080, 4 bytes long. Data: < @, > C0 40 2C 02 {13617} normal block at 0x022C34E8, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13616} normal block at 0x022C34A8, 4 bytes long. Data: < 4, > E8 34 2C 02 {13575} normal block at 0x022C27D0, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13574} normal block at 0x022C2790, 4 bytes long. Data: < ', > D0 27 2C 02 {13573} normal block at 0x022C2728, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {13572} normal block at 0x022C26E8, 4 bytes long. Data: <(', > 28 27 2C 02 {4087} normal block at 0x02264790, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {4086} normal block at 0x02264750, 4 bytes long. Data: < G& > 90 47 26 02 {4077} normal block at 0x02264478, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {4076} normal block at 0x02264438, 4 bytes long. Data: <xD& > 78 44 26 02 {4072} normal block at 0x02264228, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {4071} normal block at 0x022641E8, 4 bytes long. Data: <(B& > 28 42 26 02 {4067} normal block at 0x02264030, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {4066} normal block at 0x02263FF0, 4 bytes long. Data: <0@& > 30 40 26 02 {4007} normal block at 0x02263A50, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {4006} normal block at 0x02263A10, 4 bytes long. Data: <P:& > 50 3A 26 02 {3914} normal block at 0x02262800, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {3913} normal block at 0x022627C0, 4 bytes long. Data: < (& > 00 28 26 02 {3912} normal block at 0x02262558, 552 bytes long. Data: < h%& > 83 00 00 00 83 00 00 00 68 25 26 02 CD CD CD CD {3830} normal block at 0x01FFE328, 76 bytes long. Data: <d ,g``& Bg> 64 C2 2C 67 60 60 26 02 00 00 00 00 FC 98 42 67 {3829} normal block at 0x02266060, 12 bytes long. Data: <Df ( 0f > 44 66 03 10 28 E3 FF 01 30 66 03 10 {3825} normal block at 0x02266640, 128 bytes long. Data: < 6 / Rf& > 01 00 00 00 36 00 00 00 2F 00 00 00 52 66 26 02 {2408} normal block at 0x02265350, 64 bytes long. Data: < bS& > 01 00 00 00 16 00 00 00 13 00 00 00 62 53 26 02 {2383} normal block at 0x02265228, 56 bytes long. Data: < P& @f& Bg> 00 00 00 10 E8 50 26 02 40 66 26 02 B4 99 42 67 {2381} normal block at 0x022650E8, 114 bytes long. Data: < / / P& > 01 00 00 00 2F 00 00 00 2F 00 00 00 FA 50 26 02 {284} normal block at 0x01FF9420, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {283} normal block at 0x01FF9368, 120 bytes long. Data: < L-g Bg> 9C 4C 2D 67 20 93 FF 01 00 00 00 00 FC 98 42 67 {282} normal block at 0x01FF9320, 8 bytes long. Data: <\L-gh > 5C 4C 2D 67 68 93 FF 01 {281} normal block at 0x01FF92B8, 40 bytes long. Data: < @B > 00 00 00 00 CC CD CD CD 40 42 0F 00 00 00 00 00 {280} normal block at 0x01FF9240, 60 bytes long. Data: < h > 01 00 00 00 20 93 FF 01 68 17 00 00 00 CD CD CD Object dump complete.
こんな結果になる。Win32APIの_CrtSetDbgFlagを使うとダメな感じ。これだけでも40件報告されて、メンテしているプログラムでは4千件のリーク情報が出力された。