天天看點

atiken插值c++_[C++] 頭檔案中慎用局部靜态變量

先看看例子吧:

// 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 必須在頭檔案中申明并實作

既然都來了, 有啥想法順便留個言呗? (無奈小廣告太多, 需稽核, 見諒)