内联函数中的静态局部变量导致VS2015编译代码中的挂起

static local variable in inline function causes hang in VS2015-compiled code

本文关键字:VS2015 编译 挂起 代码 局部变量 函数 静态      更新时间:2023-10-16

我有一个沿着以下几行的遗留代码:

inline A::A() {
    static boost::shared_ptr<Data> data(new Data(""));
    data_ = data;
}

Data是某个类,data_class A的非静态成员变量。我不确定这里最初的编码器是什么想法,但有趣的是,当使用Visual Studio 2013构建时,这段代码运行良好,但当使用Visual Studio2015构建时,在加载DLL时,代码挂起(在初始化静态变量data的行上(。在加载DLL时调用代码的原因是存在class A的静态对象,例如

class B
{
 static A a_;
}

我意识到VS2015可能会以不同的方式构建代码,例如,不遵守内联提示等。但它挂起的原因是什么?是内存损坏了吗?不是试图让这个代码工作,而是试图理解这个代码可能导致的潜在问题。

感谢David Schwartz在对原始问题的评论中提出解决方案。正如我所假设的,这个问题并不是由于构造函数中static局部变量和inline提示的任何交互造成的。相反,问题是调用Data的构造函数,因为Data有一个类型为A的成员变量。这导致循环性(要创建的A需要Data,需要A(该问题通过使用命名构造函数习语解决,因此:

class A{
  public:       
    static A createDefault()
    {
       static boost::shared_ptr<Data> data(new Data(""));
        A a;
        a.data_ = data;
        return a;
    }
  protected: 
    //Make the c'tor protected so that nobody uses it by mistake (except for derived classes) 
    A(){}
    //Struct Data can access A::A():
    struct Data{
       A a_;
       Data(string str) 
       {
           //...
       }
       //...
    };
};

其他任何地方:

//...
A a(A::createDefault());//or similar
//...

剩下的一个谜团是VS2013是如何构建它的,从而使代码运行良好。