在同一类构造函数中初始化静态std :: vector 的问题

|| 如何在类中正确声明静态向量? 目前我在一行上崩溃,因为向量初始化太晚了。 示例一:
#include \"stdafx.h\"
#include <vector>    
class A{
private:
    int aValue;
public:
    static std::vector<A*> listOfA;

    A(int i)
    {
        aValue = i;
        A::listOfA.push_back(this); // !!! HERE crash in release mode only, in debug mode items add to vector, but remove when vector initialize
    }
};

A testA(1);
std::vector<A*> A::listOfA;



int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
示例二: A类
#include <vector>

class A{
private:
    int aValue;
public:
    static std::vector<A*> listOfA;

    A(int i);
};
A类
#include \"stdafx.h\"
#include \"classA.h\"

std::vector<A*> A::listOfA;

A::A(int i)
{
  aValue = i;
  A::listOfA.push_back(this); // !!! HERE crash in release mode only, in debug mode items add to vector, but remove when vector initialize
}
main.cpp
#include \"stdafx.h\"
#include \"classA.h\"

A testA(1);

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
在示例2中,如果项目中的cpp文件具有此顺序(编译顺序),则一切正常: A类 main.cpp 如果订购此产品,我们将当机: main.cpp A类     
已邀请:
        静态元素按照它们在文件中出现的顺序进行初始化,因此当您说:
A testA(1);
std::vector<A*> A::listOfA;
第一个静态变量已初始化,但其构造函数尝试使用第二个静态变量,但结果未定义。 如果静态文件位于不同的文件中,则初始化顺序不确定,因此,如果运气好的话,它似乎可以工作。通常,不要编写依赖于静态初始化顺序的代码。     
        引用自:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14 有许多解决方案,但是一个非常简单且完全可移植的解决方案是用全局函数listOfA()替换全局对象listOfA,该函数通过引用返回对象。
std::vector<A*>& listOfA()
{
    static std::vector<A*> ans;
    return ans;
}
由于静态局部对象是在第一次控件流经其声明时构造的(仅),因此上述新的listOfA()语句仅会发生一次:第一次调用listOfA()。每个后续调用将返回相同的对象。然后,您要做的就是将listOfA的用法更改为listOfA():
int _tmain(int argc, _TCHAR* argv[])
{
    // do stuff
    A::listOfA().dostuff();
    // do stuff
}
之所以称其为“首次使用时构造”成语,是因为这样做:全局Fred对象是在首次使用时构造的。 这种方法的缺点是对象永远不会被破坏。还有另一种技术可以解决此问题,但由于使用它可能会引起另一个(同样令人讨厌的)问题,因此必须谨慎使用。 [编辑]很抱歉,没有看到您已经链接到常见问题解答。他应得的荣誉[/编辑]     

要回复问题请先登录注册