我有一个奇怪的问题,静态变量显然没有按原样初始化。
我有一个与Windows和Linux一起运行的庞大项目。由于Linux开发人员没有这个问题,我建议这是某种有线Visual Studio的东西。
头文件
class MyClass
{
// some other stuff here
...
private:
static AnotherClass* const Default_;
};
CPP文件
AnotherClass* const MyClass::Default_(new AnotherClass(""));
MyClass(AnotherClass* const var)
{
assert(Default_);
...
}
问题是Default_
总是NULL
。我还在初始化该变量时尝试了一个断点,但我无法理解它。
另一类有类似的问题。
CPP文件
std::string const MyClass::MyString_ ("someText");
MyClass::MyClass()
{
assert(MyString_ != "");
...
}
在这种情况下,MyString_
始终为空。所以再次没有初始化。
有人对此有所了解吗?这是Visual Studio设置问题吗?
干杯西蒙
修改 我也遇到了静态初始化的惨败。但我不确定这是否可能是问题,因为Linux编译器没有问题。在这种情况下,编译器不应该以相同的方式做出反应吗?
答案 0 :(得分:6)
我建议您使用静态成员函数和静态变量本身:
class MyClass
{
// some other stuff here
...
private:
static AnotherClass* const getAnotherClass();
};
AnotherClass *const MyClass::getAnotherClass()
{
static AnotherClass *const p = new AnotherClass("");
return(p);
}
该标准保证在第一次调用函数时p被初始化一次,因此您将始终获得正确初始化的对象(除非您已经耗尽内存或构造函数已抛出)。
请注意 - 这可能是也可能不是线程安全的(实际上取决于您的编译器)。
而另一个注意事项 - 现在你必须忍受“内存泄漏”,因为它几乎不可能决定何时销毁对象而你没有办法将p重置为NULL。
答案 1 :(得分:4)
如果在初始化其他一些静态变量时发生这种情况,您可能会看到static initialization fiasco。
答案 2 :(得分:3)
在这种情况下编译器不应该以相同的方式做出反应吗?
没有。据我了解,各个编译单元的初始化顺序是UNDEFINED。所以Linux开发人员很幸运。今天。明天,谁知道?
答案 3 :(得分:0)
Works On My Machine(TM):
#include <iostream>
#include <cassert>
class AnotherClass
{
public:
AnotherClass(const char*) {}
};
class MyClass
{
public:
MyClass(AnotherClass* const var);
private:
static AnotherClass* const Default_;
};
AnotherClass* const MyClass::Default_(new AnotherClass(""));
MyClass::MyClass(AnotherClass* const var)
{
assert(Default_);
std::cout << "Worked!\n";
}
int main()
{
MyClass tester(NULL);
return 0;
}
我认为问题是MyClass::MyClass()
被称为另一个静态变量的构造函数。静态变量的初始化并不总是按照您希望的顺序发生。