2016-08-23 81 views
0

何時應該刪除動態創建的單例對象?是否真的需要顯式刪除對象(來自析構函數),或者一旦程序退出,操作系統/系統就會安全地聲明未刪除的內存?如果它沒有被刪除會有什麼後果?何時應該刪除動態創建的單例對象?

+0

在OS釋放你的內存的系統上,當進程退出時它就會被釋放。如果沒有,那麼你需要自己釋放它。此外,單身析構函數在流程退出之前是否執行了所需的任何操作?然後你需要明確地刪除該對象。或者考慮一個你不需要的單獨設計,尤其是不是動態分配的設計。 –

+1

這一切都取決於。什麼是具體問題? –

+0

@ Cheersandhth.-Alf單例類有一個成員變量(不同類的對象),它動態地分配內存並將其從desturcutor中刪除。但是我沒有看到明確刪除單例對象。基本上我想知道如果我明確刪除或不刪除單例對象,會發生什麼成員變量。 – Sitesh

回答

1

通常建議在應用程序退出時銷燬對象。正如在評論中提到的那樣,大多數操作系統在應用程序終止時都會釋放內存,但是如果您需要在單例的析構函數中進行清理,那麼您需要自行清理它(操作系統清理不會調用析構函數) 。

我通常在應用程序退出前刪除它,但這並不總是最佳解決方案。我發現在某些情況下,單例創建只是要刪除,或刪除後訪問並重新創建。

您可以使用atexit()函數在創建單例時註冊清理函數。例如:

static Singleton* s_instance = nullptr; 

void cleanupSingleton() { 
    delete s_instance; 
} 


class Singleton { 
public: 
    static Singleton* instance() { 
     if(s_instance == nullptr) { 
      s_instance = new Singleton(); 
      std::atexit(cleanupSingleton); 
     } 
     return s_instance; 
    } 
}; 

PS:不是最好的,線程安全的單例,但對於例如不夠好。

欲瞭解更多信息,請參閱該atexit()函數一些參考: cplusplus.comcppreference.com

1

如果你用單,用邁耶斯單:

class Singleton { 
public: 
    static Singleton& instance() { 
     static Singleton s_instance; 

     return s_instance; 
    } 

    Singleton(const Singleton&) = delete; 
    Singleton& operator=(const Singleton&) = delete; 
private: 
    Singleton() = default; 
    ~Singleton() { /* Your clean up code */ } 
}; 

析構函數會自動主要結束後調用。