靜態(tài)變量使用的一個常見錯誤-創(chuàng)新互聯(lián)

這幾天又遇到了靜態(tài)變量析構引起的問題,對象析構的時候,定義類的模塊已經不能工作了,導致了程序crash。

10年積累的網站建設、網站設計經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先建設網站后付款的網站建設流程,更有潯陽免費網站建設讓你可以放心的選擇與我們合作。

這在稍大的項目中是一個非常常見的錯誤,只要有多個模塊,靜態(tài)變量的使用就要非常小心。以前我在寫行車記錄儀的程序時也碰到過類似的問題,程序是用QT寫的,有一個靜態(tài)結構析構時調用了QT的一個全局對象來打log,QDebug吧,好像。這會引起段錯誤,當然啦,退出時的log也沒能記錄下來。后來發(fā)現(xiàn)原因就是在執(zhí)行這個析構函數(shù)時,QDebug對象已經被析構了,導致調用失敗。

這個問題在Google C++ Style Guide中是這樣建議的,
Objects with static storage duration are forbidden unless they are trivially destructible.
也就是說,除非析構函數(shù)中啥也不干,否則就不能定義靜態(tài)類變量。

這條規(guī)則的原因是靜態(tài)變量的析構順序是不確定的,所以多個靜態(tài)變量在析構時的互操作是很容易引起問題的,為減少耦合性,最好的辦法就是不要定義析構時有操作的靜態(tài)變量。

提到靜態(tài)變量,很容易想到單例模式。曾經看到有些文章建議(包括著名的《Effective C++》),單例類中的靜態(tài)對象不要在第一次訪問時new出來,而是直接定義一個靜態(tài)變量,這樣做的話就也會存在這個風險,除非這個靜態(tài)變量對應的類析構時不做任何事。

在工程中,單例的需求不可避免。有一個簡單的辦法可以規(guī)避靜態(tài)變量析構帶來的crash風險。

這個方法就是在單例中用靜態(tài)指針變量,專門寫一個函數(shù)用于析構這個指針指向的變量,并在工程退出過程中確定不再使用這個變量的時候調用這個函數(shù)。具體如下:

class Singleton
{
public:
	static Singleton* getInstance() 
    {
		if(pInstance == nullptr) 
		{
        	pInstance = new Singleton();
        }  
		return pInstance;
	}

    void free()
    {
        if (pInstance != nullptr)
        {
            delete pInstance;
            pInstance = nullptr;
        }
    }

private:
	static Singleton* pInstance;

private:
	Singleton() {}
	~Singleton() 
    {
        if (pInstance != nullptr)
        {
            throw("Singleton object used after free().");
        }
    }
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
};
Singleton* Singleton::pInstance = nullptr;

析構函數(shù)里加了個異常,目的是在free()函數(shù)調用位置不恰當?shù)臅r候發(fā)出警報。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

本文名稱:靜態(tài)變量使用的一個常見錯誤-創(chuàng)新互聯(lián)
文章源于:http://bm7419.com/article10/dgccdo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站建設、微信公眾號、搜索引擎優(yōu)化域名注冊、虛擬主機、App設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站建設網站維護公司