1

MainWindow のコンストラクターには、コードのチャンクがあります。

QMenu * filemenu = this->menuBar()->addMenu(tr("File"));
QAction * openButton = new QAction(tr("Open"), this);
connect(openButton, SIGNAL(triggered()), this, SLOT(input()));
filemenu->addAction(openButton);

メモリチェックを実行するまでは、すべて問題ないようでした。Valgrind は、ここでメモリ リークが発生していると言っているようです。MainWindow が削除される直前に QMenu が自動的に削除されるべきではありませんか? Filemenu へのポインターを記憶し、MainWindow デストラクタで手動で削除しようとしましたが、何も変わりませんでした。誰かが私が間違っていることを知っていますか?

4

1 に答える 1

1

MainWindow が削除される直前に QMenu が自動的に削除されるべきではありませんか?

QMenu インスタンス (filemenu) の destroy() シグナルにスロットを接続し、そこに qDebug() を使用して何かを出力できます。それがメインウィンドウの破壊のために出力された場合、それはデストラクタが呼び出されたこと、つまり削除されたことを意味します。

...
   connect(myMenuPointer, SIGNAL(destroyed()), receiverPointer, SLOT(test()));
...

MyClass::test()
{
    qDebug() << "My menu deleted automatically";
}

glibc などの下に何かがメモリ リークを起こしている場合、valgrind によって Qt アプリケーションでメモリ リークが検出されることがあります。そうかもしれませんが、あなたの質問に対する答えは、QMenu が自動的に削除されるということです。

于 2014-05-18T12:05:44.800 に答える