2011-12-23 5 views
0

최근에 기본 클래스의 클래스 크기가 변경되고 컴파일되지 않은 파생 클래스로 인해 충돌이 거의 발생하지 않았습니다. BaseClass라는 BaseClass가 Base.dll에 있고,이 클래스를 상속 받고 Derived.dll에있는 DerivedClass를 만들었습니다. BaseClass 크기가 변할 때마다 Derived.dll을 다시 컴파일해야합니다. 그러나 항상 모든 종속 바이너리를 찾을 수있는 것은 아니며 때로는 몇 사람이 종속 바이너리를 놓칠 수도 있습니다. 이 경우 디버깅하기가 매우 어려운 신비한 충돌이 발생합니다. 그런 문제를 좁히는 방법이 있습니까? 즉,이 단서에서 어떤 단서를 생각하게 할 수 있을까요?기본 클래스 크기 변경으로 인해 디버깅이 충돌합니다.

편집 1 : 추가 세부 정보. base1, base2, base3 등의 기본 클래스가 여러 개 있다고 가정하십시오. 각각 별도의 dll로 파생됩니다. derived1.dll, derived2.dll 및 derived3.dll. 하나의 기본 클래스에서 크기 변경을 위해 다른 모든 프로젝트를 컴파일 할 필요는 없습니다. 또한 종속성을 만드는 것은 선택 사항이 아니기 때문에이 문제를 자주 접하게됩니다.

+1

'BaseClass'의 정의를 변경하면'DerivedClass' 및 해당 종속 항목의 재 컴파일이 트리거됩니다. 왜 이런 일이 일어나지 않습니까? –

답변

0

다시 컴파일하는 것 외에는 바보 같은 옵션이 없습니다. class BaseClass에서 파생 된 클래스를 찾는 것이 문제인 경우 다음과 같이 해결할 수 있습니다.

class BaseClass : virtual FinalLock { 
    ... 
}; 

을 그리고 전체 프로젝트를 다시 컴파일 : 당신이 BaseClass 크기를 변경할 때마다

class FinalLock { 
    FinalLock() {} 
    friend class BaseClass; 
}; 

는 다음을 수행합니다. 클래스가 BaseClass에서 파생되는 경우 컴파일러 오류가 발생합니다 (실제로 클래스를 인스턴스화하면 오류가 발생합니다).

이것은 어떤 클래스가 BaseClass에 종속되는지 알려줍니다. 이 운동은 한 번만하면됩니다. 그런 다음 모든 종속 코드를 표시 할 수 있습니다.

작업을 마치면이 여분의 코드를 제거하십시오. C++ 11로, 위의 기술은 여전히 ​​쉽게 만들 수 있습니다 :

final class BaseClass { 
^^^^^ 
}; 
0

방법이 하나가 모든 종속 모듈이 올바르게 컴파일되도록 종속성을 해결하는 것입니다. 공유 라이브러리에서 번거롭게 될 수는 있지만 직접 수정할 수 없는지 확인하십시오.

방법 2는 항상 "모두 다시 작성"하는 것입니다. 또는 항상 obj 디렉토리의 모든 것을 삭제하고 빌드하십시오.

방법 3은 개체의 크기를 확인하고 거기에있는 개체의 크기를 반환하는 API 경계를 통해 새로운 호출과 비교하는 디버그 모드 코드를 추가합니다.

관련 문제