慎用局部靜態變量

慎用局部靜態變量


先看看例子吧:

////////////////////////////////////////////////////////////

// SomeClass.h
class SomeClass {
public:
    static string &func1(void) {
        static string s1;
        return s1;
    }
    static string &func2(void);
};

////////////////////////////////////////////////////////////

// SomeClass.cpp
string &SomeClass::func2(void) {
    static string s2;
    return s2;
}

////////////////////////////////////////////////////////////

看出區別了嗎? 正常情況下是不會有什麼問題的, 但如果:

1. SomeClass 在 A.so 中

2. 又有個 B.so 加載了 A.so

3. A.so 和 B.so 都通過 func1 來更改 s1 的值

 

就會造成:

s1 被創建兩次, 並且在 A.so 和 B.so 中有單獨的值, 互相獨立

 

而相對的, func2 並不會出現該問題

 

目測原因是寫在頭文件中的靜態方法被每個編譯模塊單獨編譯進模塊內了, 是否編譯器相關未知

////////////////////////////////////////////////////////////

 

目前採用以下方法繞道解決:

////////////////////////////////////////////////////////////

// SomeClass.h

extern string &GetStringRef(const char *token);
class SomeClass {
public:
    static string &func1(void) {
        static string &s1 = GetStringRef("SomeClass");
        return s1;
    }
    static string &func2(void);
};

////////////////////////////////////////////////////////////

// SomeClass.cpp

string &GetStringRef(const char *token) {

    static map<const char *, string> m;

    return m[token];

}
string &SomeClass::func2(void) {
    static string s2;
    return s2;
}

////////////////////////////////////////////////////////////

JJYY:

* 在 Android JNI 中遇到該問題

* 會有該詭異需求是因爲使用宏自動生成函數, 例如類名註冊等等, func1 必須在頭文件中申明並實現

.

over

.


轉自:http://hi.baidu.com/zerofighter/item/1fba2b27d75573c3ee10f1cd?qq-pf-to=pcqq.group

發佈了29 篇原創文章 · 獲贊 9 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章