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());
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来实现右键菜单,是不是会造成内存泄露?