2016-10-12 1 views
0

에 걸어. 여기서 원래의 코더의 아이디어가 무엇인지 모르겠지만 흥미로운 점은이 코드는 Visual Studio 2013을 사용하여 빌드 할 때 잘 작동하지만 Visual Studio 2015를 사용하여 빌드하면 코드가 멈 춥니 다 (정적 DLL로드시 변수 data이 초기화 됨). 코드가 DLL로드시 호출되는 이유는 정적 지역 변수는 나는이 라인을 따라 레거시 코드를 VS2015 컴파일 된 코드

class B 
{ 
static A a_; 
} 

내가 VS2015 인라인을 존중하지 않음으로써, 예를 들어, 다른 코드를 만들 수 있음을 인식, 예를 들어 class A의 정적 객체가 있다는 것입니다 힌트 등. 그러나 그것이 걸려있는 이유는 무엇입니까? 메모리 손상인가? 이 코드를 작동 시키려고하지 않고이 코드로 인해 발생할 수있는 잠재적 인 문제를 이해하려고합니다.

+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) 
     { 
      //... 
     } 
     //... 
    }; 
}; 

:입니다 남아

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

한 신비를이 문제가 이렇게 Named Constructor Idiom를 사용하여 해결 (A 필요가있는 Data을 필요로 생성 할 A) 을 원형 원인 VS2013이 어떻게 코드를 작성하여 코드가 잘 돌아가는지 알 수있었습니다.