繁体   English   中英

静态变量未初始化

[英]Static variable not initialized

我有一个静态变量的奇怪问题,显然没有按原样进行初始化。
我有一个与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编译器没有问题。 在这种情况下编译器不应该以相同的方式做出反应吗?

我建议你使用静态变量而不是静态变量本身的静态成员函数:

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。

如果在初始化其他一些静态变量时发生这种情况,您可能会看到静态初始化失败

在这种情况下编译器不应该以相同的方式做出反应吗?

不,据我了解,各个编译单元的初始化顺序是UNDEFINED。 所以Linux开发人员很幸运。 今天。 明天,谁知道?

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()被调用为另一个静态变量的构造函数。 静态变量的初始化并不总是按照您希望的顺序发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM