qtの単一モード-静的メンバー変数の破棄方法
最近プログラミングで基礎知識を勉強したついでに、文章の内容の一部に出典が明記されていることをメモした.以下の点について説明します.単例モード 静的ポインタのメモリ解放 クラスにおける音響明子クラスの宣言と実現方法 Qtのmain関数の正しい記述フォーマット(このピットを記録) .h-インタフェースファイル
.cpp実装ファイル
main.cpp実装ファイル
これで単例モードの静的ポインタ破棄が実現しました!余談:1.ごみ回収は次のリンクを参照してください.https://blog.csdn.net/roy1261/article/details/514259872.qt 4を使用するため.バージョン7.3の理由は、MainWindowウィンドウを手動で閉じるときにメモリアクセスエラーが発生したためです.理由は、原文を参照してください.接続を参照してください.https://www.devbean.net/2012/08/qt-study-road-2-hello-world/まず、このプログラムを標準C++で見てみましょう.メモリの漏洩が発生しています.exec()が終了すると(つまり、イベントサイクルが終了する.ウィンドウが閉じ、イベントサイクルが終了する)、labelはdeleteできません.これによりメモリが漏洩します.もちろん、プログラムが終了すると、オペレーティングシステムがメモリの回収を担当するので、この問題は深刻ではありません.このようにコードを修正してから実行しても、エラーはありません.
以前のバージョンのQtでは問題があったかもしれません(詳細は、本明細書の最後に削除線が付いている部分を参照してくださいが、豆もテストされていません.ただ、このように紹介されている文章を見ています)が、新しいバージョンのQtではほとんど問題はありません.新しいバージョンのQtでは、app.exec()の実装メカニズムが確定し、最後のビジュアルコンポーネントが閉じた後、プライマリ・イベント・ループ(すなわちapp.exec()は終了し、main()関数は終了します(appは破棄されます).**これは、すべてのビジュアル要素が閉じられていることを意味します.また、後述するように、QpaintDeviceにQpplicationインスタンスがない場合はありません.**また、Qpplicationインスタンスが明示的に閉じられている場合は、qApp->quit()などの関数が呼び出されます.QAPplicationの最後のアクションは、すべてのウィンドウを閉じることです.したがって,この場合でもクラスという問題は起こらない.main()関数であるため、main()関数が終了すると、メモリ漏洩がないことに相当するプロセスが使用するリソースがオペレーティングシステムによって回収されます.しかし、ここでは潜在的な問題があります.オペレーティングシステムは、占有メモリを乱暴に解放するだけで、オブジェクトの構造関数を呼び出すことはありません(これはdelete演算子を呼び出すのとは異なります).そのため、一部のリソース占有量が「正しく」解放されない可能性があります.実際には、最新版のSailfish OSには、このようなコードがあります.
class MainWindow : public QMainWindow
{
Q_OBJECT
static MainWindow *m_pselfmainwin;
class Garber // -- m_pselfmainwin
{
public:
Garber();
~Garber();
};
static Garber garbor;
MainWindow(QWidget *parent = NULL);
~MainWindow();
public:
static MainWindow * getInstance();
}
.cpp実装ファイル
//
MainWindow * MainWindow::m_pselfmainwin = NULL;
//
MainWindow::Garber MainWindow::garbor = MainWindow::Garber() ;
MainWindow::Garber::Garber() //
{
};
MainWindow::Garber::~Garber() //
{
if (m_pselfmainwin!=NULL)
{
delete m_pselfmainwin ;
m_pselfmainwin = NULL;
}
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{ }
MainWindow::~MainWindow()
{ }
MainWindow * MainWindow::getInstance()
{
if (m_pselfmainwin==NULL)
{
//m_pselfmainwin = new MainWindow();
//
QScopedPointer m_pselfmainwin(new MainWindow);
m_pselfmainwin->setAttribute(Qt::WA_DeleteOnClose);
m_pselfmainwin->initHmi();
}
return m_pselfmainwin;
}
main.cpp実装ファイル
int main(int argc ,char *argc[])
{
QScopedPointer app(new QApplication(argc, argv));
MainWindow *pmainWindow = MainWindow::getInstance();//
pmainWindow->show();
return app->exec();
}
これで単例モードの静的ポインタ破棄が実現しました!余談:1.ごみ回収は次のリンクを参照してください.https://blog.csdn.net/roy1261/article/details/514259872.qt 4を使用するため.バージョン7.3の理由は、MainWindowウィンドウを手動で閉じるときにメモリアクセスエラーが発生したためです.理由は、原文を参照してください.接続を参照してください.https://www.devbean.net/2012/08/qt-study-road-2-hello-world/まず、このプログラムを標準C++で見てみましょう.メモリの漏洩が発生しています.exec()が終了すると(つまり、イベントサイクルが終了する.ウィンドウが閉じ、イベントサイクルが終了する)、labelはdeleteできません.これによりメモリが漏洩します.もちろん、プログラムが終了すると、オペレーティングシステムがメモリの回収を担当するので、この問題は深刻ではありません.このようにコードを修正してから実行しても、エラーはありません.
以前のバージョンのQtでは問題があったかもしれません(詳細は、本明細書の最後に削除線が付いている部分を参照してくださいが、豆もテストされていません.ただ、このように紹介されている文章を見ています)が、新しいバージョンのQtではほとんど問題はありません.新しいバージョンのQtでは、app.exec()の実装メカニズムが確定し、最後のビジュアルコンポーネントが閉じた後、プライマリ・イベント・ループ(すなわちapp.exec()は終了し、main()関数は終了します(appは破棄されます).**これは、すべてのビジュアル要素が閉じられていることを意味します.また、後述するように、QpaintDeviceにQpplicationインスタンスがない場合はありません.**また、Qpplicationインスタンスが明示的に閉じられている場合は、qApp->quit()などの関数が呼び出されます.QAPplicationの最後のアクションは、すべてのウィンドウを閉じることです.したがって,この場合でもクラスという問題は起こらない.main()関数であるため、main()関数が終了すると、メモリ漏洩がないことに相当するプロセスが使用するリソースがオペレーティングシステムによって回収されます.しかし、ここでは潜在的な問題があります.オペレーティングシステムは、占有メモリを乱暴に解放するだけで、オブジェクトの構造関数を呼び出すことはありません(これはdelete演算子を呼び出すのとは異なります).そのため、一部のリソース占有量が「正しく」解放されない可能性があります.実際には、最新版のSailfish OSには、このようなコードがあります.
#include
int main(int argc, char *argv[])
{
QScopedPointer app(new QApplication(argc, argv));
QScopedPointer view(new QQuickView);
view->setSource("/path/to/main.qml");
...
return app->exec();
}