以下代码中嵌入的“ new”是否会导致内存泄漏?

时间:2019-02-12 17:36:30

标签: c++ qt

我不这样认为,我认为该函数终止时会删除内存,但我想向社区咨询。

void MainWindow::editCopy   (void)
{
    QWidget *pqwgtFocus = QApplication::focusWidget();

    if (pqwgtFocus != 0)
    {
        QApplication::postEvent (   pqwgtFocus,
                                    new QKeyEvent   (   QEvent::KeyPress,
                                                        Qt::Key_C,
                                                        Qt::ControlModifier
                                                    )
                                );

        QApplication::postEvent (   pqwgtFocus,
                                    new QKeyEvent   (   QEvent::KeyRelease,
                                                        Qt::Key_C,
                                                        Qt::ControlModifier
                                                    )
                                );
    }

    return;
}

3 个答案:

答案 0 :(得分:6)

是的,该应用程序将获得所有权,并且绝对安全。

  

该事件必须在堆上分配,因为发布事件队列将拥有该事件的所有权,并在发布后将其删除。发布事件后,访问它是不安全的。

https://doc.qt.io/qt-5/qcoreapplication.html#postEvent

答案 1 :(得分:3)

这里没有内存泄漏。 QApplication::postEvent拥有指针的所有权,并在完成后对其调用delete

  

该事件必须在堆上分配,因为发布事件队列将拥有该事件的所有权,并在发布后将其删除。发布事件后,访问它是不安全的。


请注意,这确实是糟糕的界面。您必须明确检查文档以确保正确使用了该功能。相反,如果它接受了QScopedPointer,那么您只要看一下函数签名,就可以知道postEvent正在获得指针的所有权。

答案 2 :(得分:1)

O(n)获取事件的记录,并在事件完成后postEvent对其进行记录。没有泄漏。