對于C++ 項目開發(fā)者來說,單例模式可以說是最常用的也是最有效的一種設計模式,無論是單線程中的懶漢模式還是線程安全的惡漢模式,亦或是其各個變種模式,都無法避免的是在使用完成后要對該單例占用的內存進行釋放,本文旨在介紹幾種單例模式內存釋放方式。

在C++代碼的編寫過程中,指針的釋放至關重要,用一句老生常談的話就是“只要New,就要Delete”,做事總要有始有終嘛。在通常情況下,只要稍微留心,內存泄漏還是不那么容易泄漏的。比如,1)函數內的new,可在使用完后進行delete;2)類內的new,可在類析構時進行delete。但是對于大家通常使用單例內存,由于使用貫穿多個類,往往會被大家遺忘。下面談論下單例模式內存的3中釋放方式:
1 程序或組件關閉前釋放
我想這種釋放方式應該是大家最常用的單例內存釋放方式了吧,至少對于沒寫多久代碼的我來說是這樣的。這種方式很簡單就是直接在程序結束前或者組件關閉前直接delete調單例就好了,或者將delete自身放在一個destroy()中。該方法也最容易讓人忘記釋放單例內存。
2 使用智能指針
用智能指針來釋放new出的內存是一種很省心的,內存釋放方式,如OSG中的osg::ref_ptr<class T>(本人接觸的第一種智能指針),UE4中的TSharePtr<class T>。當然,這種方式同樣也使用于對單例指針的釋放.。不過使用智能指針往往會導致的一個問題就是我們無法去主動控制內存的釋放,也不知道它什么時候就被釋放掉了。偶爾指針越界也挺讓人郁悶的,不過對于初學者來說確實是一種不錯的選擇。
3 使用靜態(tài)變量特性進行釋放
靜態(tài)變量,無論是全局的還是局部的都存儲在全局數據區(qū),會隨著程序的退出而釋放。而第三種方法也是利用靜態(tài)變量的這一特性來釋放單例內存,例子如下:
#include <iostream>
class A
{
public:
static A& Instance() { return *mInstance; }
private:
A()
{
std::cout <<"construct A" << std::endl;
}
~A();
static A* mInstance;
class B
{
public:
B()
{
std::cout << "construct B" << std::endl;
}
~B()
{
std::cout << "delete B" << std::endl;
delete mInstance;
mInstance = nullptr;
}
};
static B mB;
};
A* A::mInstance = new A;
A::B A::mB;
A::~A()
{
std::cout << "delete A" << std::endl;
}
void main()
{
A::Instance();
}
結果如下圖所示:

以上便為本人提供的三種單例模式內存釋放方式,希望對大家有所幫助。