Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QMenu时内存泄漏_C++_Qt_Memory_Valgrind - Fatal编程技术网

C++ 使用QMenu时内存泄漏

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("&

我试着创造一个新的世界。在使用Valgrind时,我发现内存泄漏是由
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会在这里报道