1

ランダムにクラッシュする C++ コードがあります。コードでは、いくつかの Qt ライブラリを使用しています。コンパイラは MSVS 2010 です。これはメモリ リークが原因である可能性があるといういくつかの提案に基づいて、Visual Leak Detector を使用してこれを調べ始めました。Visual Leak Detector とメモリ リーク検出は初めてです。

main.cpp のコードは次のとおりです。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
   return a.exec();
}

また、MainWindowコンストラクタは次のようになります。

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    ,   m_Inputdevice(QAudioDeviceInfo::defaultInputDevice())
    ,   m_audioInput(0)
    ,   m_input(0)
    ,   m_iVolume(0)
    ,   m_buffer(BufferSize, 0)
    ,   ui(new Ui::MainWindow)
{  // LINE 23
    ui->setupUi(this);
    initializeAudio(); // LINE 26
    udpSocket = new QUdpSocket(this); 
    udpSocket1 = new QUdpSocket(this);
    ...
    char* str = new char [30]; 
    VLDEnable();
    VLDReportLeaks(); 
}

そして、デストラクタは次のとおりです。

MainWindow::~MainWindow()
{
  delete udpSocket;
  delete udpSocket1;
  delete m_audioInput;
  delete ui;
}

いくつかの提案に基づいて、インストールしたところ、次の結果が得られました。

WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00CDED68: 12 bytes ----------
Call Stack:
c:\tmp\mainwindow.cpp (23): TestProgram.exe!MainWindow::MainWindow + 0x59 bytes
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
C8 F9 CD 00    38 FD CD 00    28 3B 6E 02                    ....8... (;n.....



---------- Block 2 at 0x00CDF9C8: 20 bytes ----------
Call Stack:
c:\tmp\generatedfiles\ui_mainwindow.h (36): TestProgram.exe!Ui_MainWindow::setupUi + 0x7 bytes
c:\tmp\mainwindow.cpp (26): TestProgram.exe!MainWindow::MainWindow
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
5C 90 DA 00    18 FA CD 00    38 90 DA 00    00 00 CD CD     \....... 8.......
CC FA CD 00                                                  ........ ........


---------- Block 3 at 0x00CDFD38: 20 bytes ----------
Call Stack:
c:\tmp\generatedfiles\ui_mainwindow.h (38): TestProgram.exe!Ui_MainWindow::setupUi + 0x7 bytes
c:\tmp\mainwindow.cpp (26): TestProgram.exe!MainWindow::MainWindow
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
24 8F DA 00    88 FD CD 00    00 8F DA 00    00 00 CD CD     $....... ........
3C FE CD 00                                                  <....... ........


---------- Block 4 at 0x026E3B28: 20 bytes ----------
Call Stack:
c:\tmp\generatedfiles\ui_mainwindow.h (41): TestProgram.exe!Ui_MainWindow::setupUi + 0x7 bytes
c:\tmp\mainwindow.cpp (26): TestProgram.exe!MainWindow::MainWindow
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
24 8F DA 00    78 3B 6E 02    00 8F DA 00    00 00 CD CD     $...x;n. ........
2C 3C 6E 02                                                  ,<n..... ........


---------- Block 6 at 0x026E4200: 8 bytes ----------
Call Stack:
c:\tmp\mainwindow.cpp (28): TestProgram.exe!MainWindow::MainWindow + 0x7 bytes
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
34 8D DA 00    50 49 6E 02                                   4...PIn. ........


---------- Block 5 at 0x026E4C90: 12 bytes ----------
Call Stack:
c:\tmp\mainwindow.cpp (76): TestProgram.exe!MainWindow::createAudioInput + 0x7 bytes
c:\tmp\mainwindow.cpp (67): TestProgram.exe!MainWindow::initializeAudio
c:\tmp\mainwindow.cpp (28): TestProgram.exe!MainWindow::MainWindow
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
74 91 DA 00    A0 4B 6E 02    78 50 6E 02                    t....Kn. xPn.....


---------- Block 7 at 0x026E54C8: 8 bytes ----------
Call Stack:
c:\tmp\mainwindow.cpp (29): TestProgram.exe!MainWindow::MainWindow + 0x7 bytes
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
34 8D DA 00    10 55 6E 02                                   4....Un. ........


---------- Block 8 at 0x026E62D8: 30 bytes ----------
Call Stack:
c:\tmp\mainwindow.cpp (33): TestProgram.exe!MainWindow::MainWindow + 0x7 bytes
c:\tmp\main.cpp (7): TestProgram.exe!main + 0xA bytes
c:\myqt\4.8.2\src\winmain\qtmain_win.cpp (131): TestProgram.exe!WinMain + 0x12 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (547): TestProgram.exe!__tmainCRTStartup + 0x2C bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): TestProgram.exe!WinMainCRTStartup
0x756233AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x77139EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x77139EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD           ........ ........

これらの結果に基づいて、メモリ リークがどこから発生したかを特定するための助けをいただければ幸いです。

4

2 に答える 2

1

ファイルのコードを確認してくださいmain.cpp。いくつかのエラーがあります。

ルールがあります - すべてnewにそのdelete.

コンストラクターで、奇妙な変数char* str = new char [30];が宣言され、割り当てられますが、解放されません。

そして、とは何m_buffer(BufferSize, 0)ですかm_Inputdevice(QAudioDeviceInfo::defaultInputDevice())

于 2013-03-03T12:34:32.893 に答える
1

親を設定している場合は、Qt オブジェクトを明示的に削除しないでください。

QObject は、オブジェクト ツリーで構成されます。Qt ウィジェットなどに親を与えると、ウィジェットの所有権がその親に譲渡されます。破壊されると、親は子のクリーンアップを処理します。そのような場合、 yourに一致するnew は必要ありませんdelete。実際、そうすると問題が発生します。

少なくとも必要ない

delete udpSocket;
delete udpSocket1;

他のコードによっては、必要ない場合もあります

delete m_audioInput;
delete ui;
于 2013-03-03T12:44:06.643 に答える