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

时间:2016-10-12 20:34:35

标签: c++ visual-studio-2013 visual-studio-2015 static inline

我有这样的遗留代码:

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

Data是某个类,data_class A的非静态成员变量。我不确定原始编码器的概念在这里是什么,但有趣的是,这个代码在使用Visual Studio 2013构建时工作正常但是当它使用Visual Studio 2015构建时,代码挂起(在静态的行上) DLL加载时变量data已初始化)。 在加载DLL时调用代码的原因是存在class A的静态对象,例如

class B
{
 static A a_;
}

我意识到VS2015可能会以不同的方式构建代码,例如,不遵守内联提示等。但是它挂起的原因是什么?这是一些内存腐败吗? 不要试图让这段代码工作 - 而是试图理解这段代码可能造成的潜在问题。

1 个答案:

答案 0 :(得分:0)

感谢David Schwartz在对原始问题的评论中提出解决方案。 问题不是由于我假设的static局部变量和inline提示在构造函数中的任何交互。相反,问题是调用Data的构造函数,因为Data具有类型为A的成员变量。这会导致创建圆形(A,需要Data,需要A) 因此使用Named Constructor Idiom解决了该问题:

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如何设法构建它以便代码运行良好。