(나는 당신이 위의 게시하는 것은 실제로 일부 헤더 파일의 조각이라고 가정한다.) 그런
상황이 일반적 일이 프로그램에서 다른 소스 파일이 서로 다른 메모리 레이아웃 관련 설정 컴파일 할 때처럼 클래스 패킹 및 정렬 설정. 헤더 파일은 이러한 여러 번역 단위에 포함되며 메모리 레이아웃 설정의 불일치로 인해 다르게 해석됩니다.
Test
개체를 이러한 번역 단위간에 전달하기 시작하면 문제가 발생합니다. 하나의 번역 단위는 하나의 메모리 레이아웃을 가진 Test
개체를 생성 한 다음 다른 번역 단위가 완전히 다른 메모리 레이아웃을 가정하거나 읽습니다. 귀하의 경우에는 각 번역 단위에서 다르게 해석되는 것은 인라인 함수입니다.
멤버 함수를 비 인라인 멤버로 정의하면 멤버 함수가 정의 된 소스 파일에만 해당하는 클래스 메모리 레이아웃이 있다고 가정합니다. 이것은 카펫 아래의 문제를 없애고 (액세스 기능이 이제 하나의 메모리 레이아웃에 묶여 있기 때문에) "작동"하게 만들지 만 여전히 그럼에도 불구하고 여전히 좋은 상황은 아닙니다. 그것은 여전히 도로 아래 유사한 자연의 다양한 문제로 이어질 수 있습니다.
프로그램의 모든 소스 파일이 정확히 동일한 클래스 메모리 레이아웃 설정으로 컴파일되었는지 확인하십시오.
P. Fred는 주석에서 언급했듯이 번역 단위 간의 클래스 메모리 레이아웃의 불일치는 소스 파일이 의존하는 헤더 파일을 수정 한 후 소스 파일을 다시 컴파일하는 것을 잊어 버리는 것과 같은 일들로 인해 발생할 수 있습니다.
이러한 문제의 또 다른 "보편적 인"원인은 전처리 지시문 (즉, #ifdef
/#endif
세그먼트로 사용자 정의 된 클래스 레이아웃)에 의존하는 클래스 정의입니다. #define
헤더 파일을 포함하는 일부 소스 파일에서 중요한 것을 잊어 버린 경우 해당 소스 파일의 클래스에 대해 다른 메모리 레이아웃이 될 수 있습니다.
출처
2011-02-09 00:01:38
AnT
는 초기화되지 않은 변수 (포인터) (코드의 다른 부분)처럼 보입니다. – thbusch
정말 사기스러운 것을 배제합시다. 값이 올바르게 설정되어 있는지 정말로 알고 계십니까? – Nim
예 값은 올바르게 설정되고 초기화되지 않은 변수가 아닙니다. 왜냐하면 모든 멤버가 올바르게 보이고 .cpp 대신 .cpp 함수를 정의한다면 말한 것처럼 말입니다.h 파일은 모두 완벽하게 작동합니다. – JumboSmith