2013-03-02 5 views
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   ........ ........ 

Я ценю любую помощь, чтобы узнать, откуда вытекает утечка памяти на основе этих результатов.

+0

Было бы хорошо, чтобы увидеть код mainwindow.cpp и главный .cpp –

+0

Я добавил код в 'main.cpp', обрезает код в' maindindow.cpp' и разместил его. – TJ1

+1

Просьба показать конструктор 'MainWindow', и, пожалуйста, отметьте строки 23 и 26 (строки, указанные в сообщениях). Кроме того, пожалуйста, сообщите, что Qt может выделять память, которая используется для всей программы, и поэтому не будет бесплатной. Это будет выглядеть как утечка памяти, но на самом деле это не так. –

ответ

1

Проверьте свой код main.cpp файл - есть некоторые ошибки.

Существует правило - каждый new должен иметь свой delete.

В вашем конструкторе странная переменная char* str = new char [30]; объявлена, выделена, но не освобождена.

И что такое m_buffer(BufferSize, 0) и m_Inputdevice(QAudioDeviceInfo::defaultInputDevice())?

+0

Спасибо за ответ, на самом деле вы правы, 'str' должен быть освобожден и вы указали мне в правильном направлении, оказалось, что основной причиной было' BufferSize', которое было близко к границе, я немного увеличил его и теперь нет аварии. – TJ1

+0

Thats nice! Рад быть полезным. Будьте осторожны со всеми вашими переменными! Удачи! – troyane

1

Не устанавливайте явно объекты Qt, если вы задали родительский элемент.

QObjects organize themselves in object trees. Предоставление виджетам Qt и тому подобному родительскому объекту переносит право собственности на виджет на этого родителя. После уничтожения родитель позаботится о том, чтобы убрать детей. В этих случаях ваш newне нуждается в соответствует delete. На самом деле, если вы это сделаете, это вызовет проблемы.

По крайней мере, вам не требуется

delete udpSocket; 
delete udpSocket1; 

В зависимости от вашего другого кода, вы можете даже не нужно

delete m_audioInput; 
delete ui; 
+0

Спасибо, Барт. 'M_audioInput' определяется как:' m_audioInput = new QAudioInput (m_Inputdevice, m_format, this); 'поэтому вы думаете, что я не должен его удалять? – TJ1

+2

В этом случае ваш 'this' [является родителем] (http://qt-project.org/doc/qt-4.8/qaudioinput.html). Это теперь «владелец» вашего QAudioInput. Так что нет, вы не должны его удалять. – Bart

+0

Спасибо, это имеет смысл. – TJ1