何時應該刪除動態創建的單例對象?是否真的需要顯式刪除對象(來自析構函數),或者一旦程序退出,操作系統/系統就會安全地聲明未刪除的內存?如果它沒有被刪除會有什麼後果?何時應該刪除動態創建的單例對象?
0
A
回答
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.com或cppreference.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 */ }
};
析構函數會自動主要結束後調用。
相關問題
- 1. 刪除動態創建的對象
- 2. 動態創建和刪除對象
- 3. 如何以動態的方式創建或刪除對象
- 4. 在Objective-C中刪除動態創建的對象時,我應該設置爲零?
- 5. 在tkinter畫布上動態創建/刪除繪製的對象?
- 6. C#中刪除動態創建的對象
- 7. MFC:刪除動態創建的CWnd對象
- 8. 刪除動態對象時出錯?
- 9. 刪除動態對象
- 10. 如何刪除單例對象
- 11. PHP - 對動態創建的「刪除按鈕」進行反應
- 12. 我應該刪除用b2World :: CreateBody()創建的b2Body實例嗎?
- 13. 如何創建sp_executesql刪除表動態
- 14. 如何從動態創建的類獲取對象的實例
- 15. 什麼時候應該使用刪除? (在動態創建的2d陣列後不刪除的後果)
- 16. Swift:動態對象創建
- 17. 動態創建JS對象
- 18. 動態創建Javascript對象
- 19. 動態創建UIView對象
- 20. 動態創建對象
- 21. 動態創建MVC對象
- 22. 動態Javascript對象創建
- 23. 創建動態對象(Eiffel)
- 24. 動態創建對象
- 25. 動態對象創建
- 26. 動態創建JavaScript對象?
- 27. 動態創建JSON對象
- 28. 動態創建C#對象
- 29. 動態創建對象java
- 30. 創建JavaScript對象動態
在OS釋放你的內存的系統上,當進程退出時它就會被釋放。如果沒有,那麼你需要自己釋放它。此外,單身析構函數在流程退出之前是否執行了所需的任何操作?然後你需要明確地刪除該對象。或者考慮一個你不需要的單獨設計,尤其是不是動態分配的設計。 –
這一切都取決於。什麼是具體問題? –
@ Cheersandhth.-Alf單例類有一個成員變量(不同類的對象),它動態地分配內存並將其從desturcutor中刪除。但是我沒有看到明確刪除單例對象。基本上我想知道如果我明確刪除或不刪除單例對象,會發生什麼成員變量。 – Sitesh