私はVisual Studio Community 2015でC++でQt 5.7を使用しています。Qtのリソースコントロールについて知っているのは、親を殺すと、その親オブジェクトへのポインタの子。しかし、私が試したとき、私はその方向を指し示す結果を得ていなかったので、なぜそれが見えないのですか。親ウィジェットを破棄するとQt 5.7がリソースを返さない
以下のコードを実行して参照ポイントを取得します。コードブロックがコメントアウトされていますのでご注意ください:
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w0 = new QWidget;
/*
QWidget* w1 = new QWidget;
w1->setWindowTitle("Window 1");
for(size_t i = 0; i < 1000; i++) {
QPushButton* pb = new QPushButton(w1);
}
w1->show();
*/
w0->show();
return a.exec();
}
このコードを実行すると、VSはプロセスメモリが4 MBであることを示します。
そして私はより多くのメモリを使用するために、コードの下に実行されます。コメントブロックのない同じコード:
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w0 = new QWidget;
QWidget* w1 = new QWidget;
w1->setWindowTitle("Window 1");
for(size_t i = 0; i < 1000; i++) {
QPushButton* pb = new QPushButton(w1);
}
w1->show();
w0->show();
return a.exec();
}
今回は、9 MBのメモリを使用しました。
これまでのところは良いです。ここで私が期待しているのは、w1を破棄すると、その子オブジェクト(プッシュボタン)で使用されているリソースが返され、使用されるメモリが少なくなるはずです。しかし、それは起こりません。私はw1を殺すとw0はまだ実行されているので、メモリ使用量を観察することができます.w0はw1の親ではなく、すべてのプッシュボタンはw1の子ですが、メモリは返されません。私は何をしているのか、間違って理解しています
更新:上記の例では、w1が指すウィンドウを閉じて(Xをクリックするだけで)、ポインタw1も削除すると思いますが、テストするために、以下のコードとそのコードを実行しました6 MBのメモリを使用します。だから、明らかに3メガバイト以下に
delete w1;
新しいコードの追加後に返されます。
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget* w0 = new QWidget;
QWidget* w1 = new QWidget;
w1->setWindowTitle("Window 1");
for(size_t i = 0; i < 1000; i++) {
QPushButton* pb = new QPushButton(w1);
}
w1->show();
w0->show();
delete w1;
return a.exec();
}
をが、2メガバイトリークが依然として存在しています。この時点で2つの質問:
1.なぜ私は明示的にw1を削除する必要がありますか?なぜウィンドウを閉じるだけで十分ではないのですか? 2.明示的にw1を削除してもまだリークはありますか?
あなたは* 'w0'と' w1'をいかに正確に殺していますか?あなたはあなたのコードにそれを示していません。 – Mike
上記の例では、w1が指し示しているウィンドウを閉じるだけで、ポインタも破棄されると考えていました(そうですか?)。今私はテストを実行し、 'w0-> show();'の下に 'delete w1;'を追加しました。そして、今使っているメモリは6 MBです。まだ4 MBではありません。だから明らかにはい私は自分自身をポインタを削除するときに違いがありますが、それはまだ漏れているようだ、と私は、ウィンドウを閉じるには、使用されるメモリを返すために十分でなければならないと思う。 – Deniz
いいえ、[WA_DeleteOnClose'属性を設定する](https://doc.qt.io/qt-5/qwidget.html#close)を設定しない限り、ウィンドウを閉じることで削除されません。それを設定しましたか? – Mike