C++ 的靜態成員變數為什麼一定要在類外定義

Achou.Wang發表於2020-10-08

C++ 的靜態成員變數為什麼一定要在類外定義

函式如下,在C++中宣告靜態成員變數的時候,在類中只是進行了宣告,並沒有實際的申請出指標的記憶體,真正的記憶體是定義初始化的時候才會進行記憶體的申請,因此,又因為static型別的變數都是隨著類的,因此不能隨著物件的建立而申請記憶體,所以需要單獨的進行類外定義,在定義的時候C++編譯器會申請記憶體給靜態指標。

#include <iostream>

using namespace std;

class Singleton
{
private:
    Singleton()
    {
        cout << "sluggard singleton construct start." << endl;
    }

public:
    static Singleton *getInstance(void)
    {
        if(NULL == m_psl) // 懶漢式,每次獲取例項都要判斷,在多執行緒中會存在問題
        {
            m_psl = new Singleton;
        }
        return m_psl;
    }

    static void FreeInstance()
    {
        if(NULL != m_psl)
        {
            delete m_psl;
            m_psl = NULL;
        }
    }
private:
    static Singleton *m_psl;
};

Singleton *Singleton::m_psl = NULL;

// 懶漢式,只有在使用的時候才會去建立
// 存在的問題,多個執行緒同時首次呼叫時,可能會出現建立多次的問題(導致記憶體洩漏)

int main(int argc, char const *argv[])
{
    
    // 使用功能去全域性獲取介面獲取資源
    Singleton *p1 = Singleton::getInstance(); 
    Singleton *p2 = Singleton::getInstance();

    if(p1 == p2)
    {
        cout << "p1 equal p2" << endl;
    }
    else
    {
        cout << "p1 not equal p2" << endl;
    }
    
    // 手動釋放單例模式建立的唯一一個物件
    Singleton::FreeInstance();
 
    cout << "singleton." <<  endl;
    return 0;
}



相關文章