2016-10-12 7 views
0

でハングアップ:静的ローカル変数は、私はこれらの線に沿ってレガシーコードを持っているVS2015でコンパイルされたコード

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は、例えば、インラインを尊重しないことによって、異なったコードを構築することができることを実現しますヒントなど。しかし、それが掛かる理由は何でしょうか?メモリ破損ですか? このコードを動作させようとするのではなく、このコードによって引き起こされた潜在的な問題を理解しようとしています。

+0

[mcve]してください。 – user4581301

+0

これは実行可能かどうかわかりません(最小、完全、および検証可能な例) - このコードは巨大なソリューションの一部です。私は、このコードが達成しようとしている問題を必ずしも解決するとは限らない、理論上の問題を理解しています。整合性を保って再現できない可能性があります。 – PeterD

+0

この関数が呼び出されるコンテキストを確認する必要があります。また、 'Data'のコンストラクタが実際に何をしているのかを知るのに役立ちます。投稿されたコードには、問題が何であるかの手がかりを与えるものは何もありません。 –

答えて

0

コメントの解決方法を元の質問に示唆してくれたDavid Schwartzに感謝します。 問題は、ローカル変数staticとコンストラクタ内のinlineヒントの相互作用が原因ではありませんでした。代わりにDataのコンストラクタの呼び出しが問題でした。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) 
     { 
      //... 
     } 
     //... 
    }; 
}; 

をどこでも、他:これは、問題は、このようにNamed Constructor Idiomを使用することによって解決される(Aを必要とし、作成するADataを必要とし、)真円度 を引き起こし

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

されたまま1つの謎どのようにVS2013がコードをうまく実行できるようにビルドすることができましたか。

関連する問題