靜態庫中應慎用靜態類成員

2021-04-01 15:33:42 字數 797 閱讀 1533

有各種各樣的原因會用到類靜態成員,一般是共享資料,但編寫靜態庫的時候應慎重考慮,因為用在應用程式中沒什麼問題,但用在dll中,可能災難就開始了,看以下乙個例子:

靜態庫中有乙個名為testsql的資料庫操作類,有乙個靜態成員m_count記錄對某一資料庫的訪問記數,每有一次資料庫操作就將該值加一。當然在靜態庫里會把這個值初始化為0:

int testsql::m_count = 0;

為了應付多執行緒操作的情況,該類內部很好地實現了同步處理機制。這樣程式設計很方便,只要連線這個靜態庫,不管產生了多少testsql的物件,都能知道對資料庫的操作次數。資料庫操作很複雜,會執行一些儲存過程,而且資料庫儲存過程可能會變,那相應呼叫**也要變動,自然會想到把這些**放到乙個dll,資料庫儲存過程變動,只要修改這個dll的**就行了。應用程式執行簡單的資料庫操作,當要執行儲存過程就呼叫這個dll。好,問題來了,應用程式執行了乙個資料庫查詢操作,然後呼叫dll執行乙個儲存過程,這時候這個靜態m_count的值是多少?是2嗎?錯了,應用程式裡是1,dll裡面也是1,即使是把exe裡的testsql物件作為引數傳給dll執行,也還是1,因為雖然是在同乙個程序空間,但是編譯器編譯的時候,是把靜態庫連線進來,exe和dll分別有自己的int testsql::m_count,因此exe和dll是分別記數的,即使把exe裡產生的物件:testsql* sqlexe作為引數傳遞給dll,但是在dll裡面執行sqlexe->資料庫操作函式(),是在自己的m_count上記數,並不會改變exe裡的m_count值。

上面講的這種情況還不會產生異常,如果靜態成員是指標的話,就有可能會引起非法操作了,因此編寫靜態庫的時候,應注意這個問題。

靜態成員 靜態方法 靜態類

1.靜態成員屬於類所有,非靜態成員屬於類的例項所有,即使用靜態成員不需要例項化 using system using system.collections.generic using system.linq using system.text namespace mystatic public cl...

類中的靜態成員變數 靜態成員函式

類中的靜態成員變數 靜態成員函式?1 類中的靜態成員變數 靜態成員變數屬於整個類,不屬於某個特定的物件,因此無論建立了多少個物件,所有物件都共享類中的靜態成員變數。靜態成員變數必須在類內宣告,類外初始化。2 類中的靜態成員函式 靜態成員函式也是屬於類本身,而不屬於某個特定的物件。靜態成員函式與普通成...

類靜態成員和類靜態成員函式

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...