C++ 使用QMenu时内存泄漏
我试着创造一个新的世界。在使用Valgrind时,我发现内存泄漏是由C++ 使用QMenu时内存泄漏,c++,qt,memory,valgrind,C++,Qt,Memory,Valgrind,我试着创造一个新的世界。在使用Valgrind时,我发现内存泄漏是由QMenu引起的。我无法准确地理解这一点。我确实尝试过跟踪,但即使这样也导致了泄漏。Valgrind通过addMenu调用通知此处发生泄漏: void MainWindow::createMenu() { //Create menus QAction *quit = new QAction("&Quit", this); QMenu *file = menuBar()->addMenu("&
QMenu
引起的。我无法准确地理解这一点。我确实尝试过跟踪,但即使这样也导致了泄漏。Valgrind通过addMenu调用通知此处发生泄漏:
void MainWindow::createMenu()
{
//Create menus
QAction *quit = new QAction("&Quit", this);
QMenu *file = menuBar()->addMenu("&File");
file->addAction(quit);
connect(quit, &QAction::triggered,
[=]() {
QApplication::quit();
});
//Creating instances of ticker and timer here
//Done so that the connection between ticker and timer is possible
ticker = new Ticker(this);
timer = new Timer(this);
connect(timer, &Timer::timeout, ticker, &Ticker::playSound);
}
这正好是Valgrind日志
The leaks happen with 78 (32 direct, 46 indirect) bytes in 1 blocks are definitely lost in loss record 11,297 of 16,371
in MainWindow::createMenu() in /home/user/Documents/C/QT/Metronome/MainWindow.cpp:47
1: operator new(unsigned long) in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
2: 0x1630a434
3: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.5.1
4: QMainWindow::menuBar() const in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.5.1
5: MainWindow::createMenu() in /home/user/Documents/C/QT/Metronome/MainWindow.cpp:47
6: MainWindow::setMainWindow() in /home/user/Documents/C/QT/Metronome/MainWindow.cpp:20
7: MainWindow::MainWindow(QWidget*) in /home/user/Documents/C/QT/Metronome/MainWindow.cpp:6
8: main in /home/user/Documents/C/QT/Metronome/main.cpp:22
所以我的问题是,我该如何布置菜单以避免内存泄漏?顺便说一句,删除
QAction
,QMenu
部分不会导致泄漏。在main()
函数中执行此操作有助于解决问题:
MainWindow *window = new MainWindow();
是否新建了主窗口?请确保在堆栈上创建主窗口或在main()末尾删除它,否则valgrind将报告泄漏。另外,你在哪个平台上测试?我在Ubuntu 16.04机器上测试。让我尝试在堆栈上创建主窗口,然后查看响应。好吧,这就成功了!做了一个
MainWindow*window=newmainwindow()代码>现在我看不到任何泄漏与您的问题无关,只是代码上的一个注释,您可以将连接写成connect(quit,&QAction::triggered,qApp,&QApplication::quit)代码>现在您也只是泄漏主窗口-很可能valgrind--leak check=full--show leak kinds=all
仍将在仍可访问类别下显示泄漏。另外:正如我在reddit上已经说过的:->如果您将所有内容都放在堆栈上,那么您应该不会看到任何泄漏。Valgrind在这方面是正确的。创建一个MWE,然后其他任何人都可以测试它,看看他们是否看到相同的问题。这个这就是我现在运行valgrind时看到的。我不知道为什么valgrind会在这里报道