0

나는 배열 및 기본 생성자와 C++ 클래스 Matrix22 있습니다컴파일러가 스택에 충분한 공간을 예약하지 않는 이유는 무엇입니까?

class Matrix22{ 
    /* something more */ 
    double mat[2][2]; 
    Matrix22(){ 
    for(int i=0; i<2; i++) 
     for(int j=0; j<2; j++) 
     mat[i][j] = i==j ? 1.0 : 0.0; 
    } 
}; 

나는 내 프로그램에서 그것을 사용 세그먼트 오류를 ​​얻었다. 나머지는 매우 어렵고 복잡했기 때문에 나는 단지 Matrix22()을 호출하는 간단한 테스트 루틴을 작성했습니다. 더 이상 세그 폴트가 아닙니다.

그런 다음 문제를 디버그하기 위해 gdb을 실행했습니다. 별도의 테스트 루틴에서 생성자를 호출하면 gcc은 멤버 mat에 대한 일부 메모리를 예약합니다. 나는 스택을 탐색 할 수 있고 배열 다음에 몇 바이트 뒤에 리턴 주소를 볼 수있다.

주 프로그램에서 컴파일러는 충분한 공간을 예약하지 않습니다. 첫 번째 요소 (mat[0][0])가 쓰여 지지만 더 많은 쓰기가 다음 스택 프레임을 덮어 씁니다. 또한 생성자 전에 bt 명령이 올바른 백 트레이스를 반환하는지 확인합니다. 여기서 중요한 할당 후에 백 트레이스가 손상되었는지 확인할 수 있습니다.

내 질문은 : 한 경우 컴파일러 (또는 링커?) 배열에 대한 충분한 공간을 예약하지 않는 반면, 다른 경우에는 일어나지 않는 이유는 무엇입니까?

추 신 : 두 "테스트 케이스"는 동일한 컴파일러와 플래그로 컴파일되고 동일한 오브젝트 파일에 대해 alsolink됩니다.

편집 :

여기

가 독방 감금 오류없이 작동하는 "간단한"테스트 케이스이다 :

와 코드가 독방 감금 오류가 클래스 ModuleShaddower (혼합 헤더 및 구현)에 생성

void test_Matrix22() 
{ 
    Framework::Math::Matrix22 matrix; 
} 
:

class ModuleShaddower{ 
    public: 
     ModuleShaddower(PVModule& module, const EnvironmentalSetup& setup, const Position& position); 
    private: 
     Matrix22 rotMatrix90; 
}; 

ModuleShaddower::ModuleShaddower(PVModule& module, const EnvironmentalSetup& setup, const Position& position) 
    : module (module), position(position), setup(setup), logger(LoggerFactory::getLoggerInstance()) 
{ 
    double mat[][2] = {{0, -1},{1, 0}}; // This line will never be reached 
    rotMatrix90 = Matrix22(mat); 
} 

알다시피, 그것은 나머지 부분에서부터입니다. 아마도 문제가되는 코드를 추출하려고 시도하지만 이것이별로 도움이되지 않을 것이라고 생각합니다.

+0

완벽한 테스트 케이스를 제공 할 수 있습니까? (실패한 사람) –

+0

올리 (Oli)의 말 : 당신이 수업을 어떻게 사용하고 있는지 보여주십시오. –

+0

짧은 테스트는 문제가되지 않습니다. 긴 버전에는 수천 줄의 코드가 있습니다. –

답변

0

다른 위치에있는 두 개의 오브젝트 파일이 같은 이름을 가지고 있기 때문에 문제가 발생했습니다. 결과로 생성 된 정적 라이브러리는 해당 객체 코드에서 생성되었지만 잘못된 파일이 바뀌는 경우가 있습니다 (둘 다 Shaddower.o이라고 함). 내가 파일의 이름을 변경함에 따라 모든 오류는 더 이상 발생하지 않았습니다.

이 문제의 정확한 원인을 알 수는 없지만 해결할 수 있습니다.

0

ModuleShaddower 생성자 코드에 도달하지 못한 경우 (코드 주석에 따라) 생성자 초기화 목록 (모듈의 생성, 소유 등 관련)에 문제가 있습니다.

+0

나는 당신과 동의 할 것입니다. 그러나 디버거를 살펴보면 Matrix22() 생성자를 입력합니다. 처음에는 스택이 괜찮습니다 ('bt '를 통해 확인). 루프가 완료되면 스택이 손상됩니다. 그래서 나에게는 문제가있는 코드가 Matrix22() 생성자 내에 있다는 것이 확실합니다. 추신 : 다른 매개 변수는 모두 참조입니다. 그들은 문제없이 외부에서 만들어집니다. 문제가 있다면 문제는 내 의견으로는 다른 위치에서 발생해야합니까 아니면 틀린 것입니까? –

관련 문제