У меня есть код C ++, который случайно падает. В коде я использовал некоторые библиотеки Qt. Компилятор MSVS 2010. Основываясь на некоторых предположениях о том, что это может быть связано с утечками памяти, я начал искать это с помощью 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 ........ ........
Я ценю любую помощь, чтобы узнать, откуда происходят утечки памяти, основываясь на этих результатах.
Проверьте свой код main.cpp
файл — есть ошибки
Есть правило — каждому new
должен иметь свой delete
,
В вашем конструкторе странная переменная char* str = new char [30];
объявляется, выделяется, но никогда не освобождается.
И что m_buffer(BufferSize, 0)
а также m_Inputdevice(QAudioDeviceInfo::defaultInputDevice())
?
Не удаляйте явно ваши объекты Qt, если вы установили родителя.
QObjects организуются в деревья объектов. Предоставление виджетов Qt и тому подобное родительскому элементу передает владение виджетом этому родителю. После уничтожения родитель позаботится о том, чтобы убрать своих детей. В этих случаях ваш new
не требуется соответствие delete
, На самом деле, если вы сделаете это, это вызовет у вас проблемы.
По крайней мере, вам не нужно
delete udpSocket;
delete udpSocket1;
В зависимости от вашего другого кода вам может даже не понадобиться
delete m_audioInput;
delete ui;