先看看例子吧:
// 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;
}
看出差別了嗎? 正常情況下是不會有什麼問題的, 但如果:
SomeClass 在 A.so 中
又有個 B.so 加載了 A.so
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 m;
return m[token];
}
string &SomeClass::func2(void) {
static string s2;
return s2;
}
JJYY:
在 Android JNI 中遇到該問題
會有該詭異需求是因為使用宏自動生成函數, 例如類名注冊等等, func1 必須在頭檔案中申明并實作
既然都來了, 有啥想法順便留個言呗? (無奈小廣告太多, 需稽核, 見諒)