X''*_*X'' 1 c++ unordered-map c++11 xcode4.5
我在类C中有一个静态unordered_map.如果我将类定义和声明放在包含函数main的文件的不同文件中,我会遇到行为上的差异.
问题是我观察到如果类C与函数main在同一个编译单元中,一切都很好,我只看到一次文本"new string created:c".但是,如果我将我的代码分成三个文件(参见下面的清单),我会看到"new string created:c"两次,这意味着我的静态unordered_map在进入main之前被擦除了.
我的问题是:为什么会发生这种情况?(只有在使用Apple LLVM编译器4.1进行编译时才会出现这种差异.我已经使用g ++ 4.7 -std = c ++ 11测试了它,并且拆分代码运行得很好.)
提前感谢任何想法!
// would go to My_header.h
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
class C{
public:
C(const string & s);
private:
static unordered_map<string, string*> m;
string *name;
};
// would go to My_code.cpp
// (when separated, add #include "My_header.h")
unordered_map<string, string*> C::m;
C::C(const string & s):
name(NULL)
{
string*& rs = m[s];
if(rs)
{
name = rs;
}
else
{
cout<<"new string created: "<<s<<endl;
rs = name = new string(s);
}
}
// would go to main.cpp
// (when separated, add #include "My_header.h")
C c("c");
int main(int argc, const char * argv[])
{
cout << "main" << endl;
C c1("c");
}
Run Code Online (Sandbox Code Playgroud)
全局对象的初始化顺序仅在一个转换单元内定义.在不同的翻译之间,订单不能保证.因此,您可能会看到std::unordered_map在构造之前访问所产生的行为.
当然,避免这些问题的方法是不使用全局对象.如果realky需要使用全局对象,最好用函数包装对象.这样就可以保证在第一次访问对象时构造对象.使用C++ 2011,构建甚至是线程安全的:
T& global() {
static T rc;
return rc;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |