簡體   English   中英

C ++如何刪除許多類中使用的Singleton對象

[英]C++ how to delete Singleton object's used in many classes

假設我有3個班級(A,B和C)。 每個類都有一個Singleton類的實例變量,並在該類的某些函數中使用此實例變量。

該類可能如下所示:

SingletonClass* mSingletonClass; // declared in header file

mSingletonClass = SingletonClass::getInstance(); // called in constructor

mSingletonClass->doSomething();     // called in function doSomething()
mSingletonClass->doSomething1();    // called in function doSomething1()

單例類

class SingletonClass : public QObject {
    Q_OBJECT
public:
    static SingletonClass* getInstance();

    // some functions
private:
    SingletonClass();
    SingletonClass(SingletonClass const&);
    SingletonClass& operator=(SingletonClass const&);
    static SingletonClass* mInstance;
};

單例類

SingletonClass* SingletonClass::mInstance = 0;

SingletonClass* SingletonClass::getInstance() {
    if (!mInstance) {
        mInstance = new SingletonClass();
    }

    return mInstance;
}

SingletonClass::SingletonClass() : QObject() {
}

我應該如何delete實例變量?

如果我打電話delete mSingletonClass; 在每個解構函數(A,B和C)上,應用程序崩潰。

如果我只叫delete mSingletonClass;是否足夠delete mSingletonClass; 一次,例如在A類中?

您絕不會在使用單例對象的任何類中銷毀它。 單例是單例的根本原因是在系統中只有一個實例,它創建一次並永久保存,直到程序即將退出。

John Vlissides在他的C ++ Report文章“ 殺死單身人士”中討論了一種破壞單身人士的方法。 他建議使用特殊的“防護”對象,該對象在破壞時會刪除指向單例的指針。 在現代C ++中,您可以通過將unique_ptr<T>指向單例實例來實現相同的效果(可以將其用於mInstance變量)。

您可以在SingletonClass內放置一個靜態成員變量(例如SingletonClassDestroyer)以幫助銷毀它,因為當程序終止時,靜態成員變量的生命周期就會結束。 SingletonClassDestroyer應該采用SingletonClass實例,並在其自己的析構函數〜SingletonClassDestroyer()中銷毀它。 因此,SingletonClassDestroyer將幫助您最終自動銷毀SingletonClass實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM