Вызывает ли утечка памяти встроенное «новое» в следующем коде? - PullRequest
0 голосов
/ 12 февраля 2019

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

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 голосов
/ 12 февраля 2019

postEvent берет на себя управление событием и delete s, когда оно завершено.Нет утечки.

0 голосов
/ 12 февраля 2019

Да, приложение переходит в собственность, и оно совершенно безопасно.

Событие должно быть размещено в куче, поскольку очередь событий после события станет владельцем события и удалит его после публикации.,Доступ к событию после его публикации небезопасен.

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

0 голосов
/ 12 февраля 2019

Здесь нет утечки памяти.QApplication::postEvent вступает во владение указателем и после этого вызовет delete для него:

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


Обратите внимание, что это действительно плохой интерфейс.Вы должны явно проверить документацию, чтобы убедиться, что вы используете функцию правильно.Если бы он вместо этого принял QScopedPointer, то вы бы просто узнали, посмотрев на сигнатуру функции, что postEvent стал владельцем указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...