桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

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千件のリーク情報が出力された。