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

來源:互聯網
上載者:User

有各種各樣的原因會用到類靜態成員,一般是共用資料,但編寫靜態庫的時候應謹慎考慮,因為用在應用程式中沒什麼問題,但用在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值。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.