慎用局部静态变量

慎用局部静态变量


先看看例子吧:

// 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值