私はこのコードをスロット機能に持っています。誰もが知っているQMenuメモリリークが、それを修正する方法は?
QCursor cur=this->cursor();
QMenu* pRightKeyMenu=new QMenu(this);
pRightKeyMenu->popup(cur.pos());
マウスの右ボタンをクリックすると、それが呼び出されます。その後、私は記憶が上がっていくのを見て、決して落ちない。どうすれば修正できますか?
私はこのコードをスロット機能に持っています。誰もが知っているQMenuメモリリークが、それを修正する方法は?
QCursor cur=this->cursor();
QMenu* pRightKeyMenu=new QMenu(this);
pRightKeyMenu->popup(cur.pos());
マウスの右ボタンをクリックすると、それが呼び出されます。その後、私は記憶が上がっていくのを見て、決して落ちない。どうすれば修正できますか?
変数pRightKeyMenu
が漏れています。
一つの可能な解決策があるため、それを再利用することで、あなたのコードで、作成したQMenuは常に同じです:
Widget::Widget()
{
// ...
this->pRightKeyMenu = new QMenu(this);
}
// Slot
void Widget::contextMenu()
{
QCursor cur=this->cursor();
this->pRightKeyMenu->popup(cur.pos());
}
試してください:あなたはそれを解放していないので、
QMenu pRightKeyMenu;
pRightKeyMenu.exec(cur.pos());
ときスコープのうちpRightKeyMenuが削除されます - あなたも(execを '@killaclickポップアップ – killdaclick
は表示されません)、それが閉じられる前にメニューがスコープの外に行くことはありませんので、'ブロッキング操作です。 – kayahr
また、あなたが行うことができます:
QCursor cur=this->cursor();
QMenu* pRightKeyMenu=new QMenu(this);
connect(pRightKeyMenu, SIGNAL(aboutToHide()), pRightKeyMenu, SLOT(deleteLater()));;
pRightKeyMenu->popup(cur.pos());
この方法は私のケースを約束しているようですが、それはときにはsegfaultsになることが判明します。少なくとも、Windowsネイティブのモーダルダイアログが実行されたときのような感じです。 – Predelnik
を任意の漏れを避けるために、 QMenuをQScopedPointerとしてクラスに追加し、クラスコンストラクターでメニューをインスタンス化します。
class Widget : public QWidget
{
...
private:
QScopedPointer<QMenu> _myMenu;
}
Widget::Widget()
{
...
_myMenu.reset(new QMenu(this));
_myMenu->addAction("Some menuitem..", this, SLOT(menuItemActivated()));
}
これは良い解決策に見えます、私はit.thankを試してみます –