qtの単一モード-静的メンバー変数の破棄方法

3193 ワード

最近プログラミングで基礎知識を勉強したついでに、文章の内容の一部に出典が明記されていることをメモした.以下の点について説明します.
  • 単例モード
  • 静的ポインタのメモリ解放
  • クラスにおける音響明子クラスの宣言と実現方法
  • Qtのmain関数の正しい記述フォーマット(このピットを記録)
  • .h-インタフェースファイル
    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();
    }