2017-12-21 42 views
0

C++ 14를 사용하고 있습니다. 정적 클래스 멤버가 있습니다. 의사 코드 :정적 구성원 초기화 디버그 및 릴리스 모드에서 특정 환경에서 다르게 작동합니다.

Class Zoo 
{ 
     Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic> _matrix; 

     Zoo() 
     { 
     _matrix.resize(6, 6) 
     } 
} 

Class Foo 
{ 
    static Zoo _member; 
} 

나는 좋은 범위의 단위 테스트를 많이해야한다고 말해야합니다. 이 코드는 컴파일 및 릴리스 및 디버그 (x64) 한 env 잘 작동합니다. VS 2016. 그리고 다른 env (또한 거기에 VS 2016 함께 컴파일 된) 디버그 모드에서 작동하고 릴리스에서 0xFFFFFFFFFFFFFFFF에서 _matrix.resize(6, 6) 초기화 중에 위치를 읽는 액세스 위반이 있습니다. 또 다른 경우 초기화 중 다른 장소에서도 초기화 중에 힙 손상이 발생합니다. 솔루션을 여러 번 다시 빌드했습니다. 수동으로 VS 빌드 폴더를 정리했습니다. MS 및 Intel 컴파일러를 다시 시작했습니다. :) 같은 코드가 디버그에서 작동하는지, 릴리스에서 작동하는지 이해할 수 없습니다. 다른 env의 석방. 이것이 정적 멤버 초기화에 어떤 영향을 줄 수 있습니까? 릴리스 모드 때문에 정상적으로 디버그 할 수 없습니다. 나는 내 프로젝트에서 Eigen lib을 사용하고 있다고 말해야한다. Eigen은 벡터화와 컴파일러 내장 함수를 릴리스 모드로 사용하고 있기 때문에 발생할 수 있다고 생각하며 잠재적으로 다른 envs에 설정된 다른 명령어로 컴파일 될 수 있지만 여전히 이해할 수는 없다. 이것이 정적 멤버 초기화에 어떤 영향을 미칠 수 있는지. 이 동작은 수시로가 아닌 지속적으로 재현됩니다.

+2

호기심에서 정적 멤버를 정의 해 보았습니까? 이렇게, 'Zoo Foo :: _ member'? – linuxfever

+0

@linuxfever 예,이 경우 오류가 없습니다. –

+0

실제 [mcve]를 제공하고 작동하지 않는 의사 코드는 제공하지 마십시오. 문제의 근원은 실제로 다른 곳에있을 수 있습니다. – chtz

답변

0

나는 "이유"과 해결 방법을 찾았지만 기술적으로 나는 어떤 의미가 표시되지 않습니다이 :

나는 한 번 더 정적 클래스 ifstream에서 값을 역 직렬화하는 여러 정적 기능을 위해 StreamReader 않고 모든 필드가 없다 :

StreamReader 
{ 
    static int ReadInt(ifstream& in); 
} 

int StreamReader::ReadInt(ifstream& in) 
{ 
    int curInt; 
    in.read((char*)(&curInt), sizeof(int)); 
    return curInt; 
} 

나는 불렀다 :

ifstream in(_dataPath, ios::in | std::ios::binary); 
int cols = StreamReader::ReadInt(in); 
int rows = StreamReader::ReadInt(in); 

전과 :

_matrix.resize(cols, rows). 

나는 ReadInt()에서 static 키워드를 제거했습니다. 그리고

ifstream in(_dataPath, ios::in | std::ios::binary); 
StreamReader ser; 
int cols = ser.ReadInt(in); 
int rows = ser.ReadInt(in); 

에 코드를 변경하고 이제 모든 디버그 및 릴리스에서 모두 작동했다. 말도 안되는 소리. 이것이 왜 도움이되었는지 모르겠지만 한 가지 결론을 내 렸습니다. 통계학 사용을 피하십시오.