Qt 我如果在QWidget::contextMenuEvent函数中new QMenu来实现右键菜单,是不是会造成内存泄露?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 我如果在QWidget::contextMenuEvent函数中new QMenu来实现右键菜单,是不是会造成内存泄露?相关的知识,希望对你有一定的参考价值。

因为每次都new 却没有delete,难道是右键菜单小时候就释放了?
我是参考了http://www.cppblog.com/biao/archive/2010/01/01/104594.aspx
void gwExportAIsSettings::contextMenuEvent( QContextMenuEvent * event )

QMenu* popMenu = new QMenu(this);
popMenu->addAction(new QAction( tr("添加"), ui.projectFilesList ) );
popMenu->addAction(new QAction( tr("删除"), ui.projectFilesList ) );
if(ui.projectFilesList->itemAt( mapFromGlobal( QCursor::pos() ) ) != NULL) //如果有item则添加"修改"菜单 [1]*

popMenu->addAction(new QAction( tr("修改"), ui.projectFilesList ) );


popMenu->exec(QCursor::pos());

参考技术A QT有内存回收机制
QMenu* popMenu = new QMenu(this);
这种神情方式下,当父类窗口(this所代表的窗口)关闭时,QMenu所占用的内存会一起被回收

还有一种减小内存申请量的方法,就是在类gwExportAIsSettings中建立一个QMenu的private变量,每次调用contextMenuEvent方法时,直接为其添加action即可,这样只new一次就可以了。追问

也就是说如果父窗口不关闭,我不断的点击鼠标右键弹出菜单,就会一直new是吗?这些申请的内存会在父窗口关闭时一起释放?那岂不是每次new的内存在释放之前还得和父窗口关联起来?

追答

QT的机制是这样的,要是想单独进行内存回收,就这样申请
QMenu* popMenu = new QMenu(NULL); 然后想办法自己在适当的方法中delete

或者你使用上面说的第二种方法!只申请一次就可以了

以上是关于Qt 我如果在QWidget::contextMenuEvent函数中new QMenu来实现右键菜单,是不是会造成内存泄露?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 我如果在QWidget::contextMenuEvent函数中new QMenu来实现右键菜单,是不是会造成内存泄露?

Qt5。在 QML 中嵌入 QWidget 对象

通过 C API 提供 QWidget 的 DLL

QT-如何在 QThread 中使用 QWidget?

Qt 必须在 QWidget 之前构造 QApplication

Qt 设计器创建的 QWidget 不被识别为 QWidget