种的static成员初始化时机

类的static成员初始化时机
VC2008

C/C++ code

// .h
#pragma once

#include <list>

using namespace std;

class CTestClass
{
public:
    CTestClass(void);
    ~CTestClass(void);

    static list<int> s_list;
};

// .cpp
#include "StdAfx.h"
#include "TestClass.h"

list<int> CTestClass::s_list; // <-- 断点1

CTestClass::CTestClass(void)
{
    s_list.push_back(1); // <-- 断点2
}

CTestClass::~CTestClass(void)
{
}



在某个工程里,断点2竟然先断,导致static的list还没初始化就被使用了,导致崩溃。请问为什么在某个工程里断点2会先断?这个工程比较特殊的就是这个类是用相对路径引用另外一个工程里的文件的。

------解决方案--------------------
绕开这种用法吧。《C++程序设计陷阱》
------解决方案--------------------
用singleton控制创建和访问时机,或者简化方法如:
C/C++ code

class CTestClass
{
public:
    CTestClass(void);
    ~CTestClass(void);

   typedef list<int> TestList;
   static TestList& GetInternalList()
   {
      static TestList s_list; // <-- 断点1
      return s_list;
   }
};

CTestClass::CTestClass(void)
{
    GetInternalList().push_back(1); // <-- 断点2
}