我的gcc版本是4.8.5
我有两个cpp文件:
虽然1.cpp中有1.cpp的静态函数。 在大多数机器中,我们应该这样:
或者它会导致编译错误或运行时错误。
但是,在我的gcc 4.8.5机器上,我必须使用“g ++ 1.cpp 2.cpp”进行编译才能使其成功运行。
这是gcc4.8.5的属性吗?或者我的软件有问题,或者我用错了?
=============================================== ===============
我的机器是安装在mac的virtulbox上的centos7。这是我的代码:
1.H
#include <map>
using namespace std;
class A {
private:
A();
static A _instance;
map<int, int> test_map;
public:
static A& get_instance();
static void fun();
};
1.cpp
#include <iostream>
#include "1.h"
using namespace std;
A A::_instance;
A::A() {
cout << "A::A()\n";
}
A& A::get_instance() {
cout << "A::get_instance()\n";
return A::_instance;
// static A instance;
// return instance;
}
void A::fun() {
cout << "A::fun()\n";
get_instance().test_map[1];
}
的main.cpp
#include <iostream>
#include "1.h"
using namespace std;
int test() {
cout << "test()\n";
A::fun();
return 0;
}
int y = test();
int main() {
cout << "main()\n";
A::fun();
}
在大多数机器和我在网上看到的内容中,我们应该像这样编译: g ++ main.cpp 1.cpp
但在我的机器上,我必须像这样编译: g ++ 1.cpp main.cpp
我的机器或我的gcc出了什么问题?
答案 0 :(得分:0)
我认为你正面临static initialization order fiasco这是一个经典的C ++错误。如果在调用test()
的构造函数之前调用main.cpp中的初始化函数A::_instance
,则代码将访问未初始化的A::_instance::test_map
字段,这可能会导致分段错误。我建议你在需要时重写getInstance
来创建实例:
A *A::_instance;
A& A::get_instance() {
cout << "A::get_instance()\n";
if(!_instance)
_instance = new A;
return *A::_instance;
}
作为旁注,我建议您使用AddressSanitizer自动检测此类错误和类似错误。