2011-12-23 79 views
0

最近,由於基類和派生類沒有被編譯,因此類大小發生變化,所以我一直面臨着很少的崩潰。讓我給你一個簡單的例子。我有一個基類,'BaseClass'出現在Base.dll中,並且我繼承了該類並創建了Derived.dll中存在的DerivedClass。每當BaseClass大小發生變化時,應重新編譯Derived.dll。但是,找到所有依賴的二進制文件並不總是可能的,有時候人們會錯過一些依賴的二進制文件。在這些情況下,我們會遇到非常難以調試的神祕崩潰。有什麼辦法可以縮小這些問題嗎?換句話說,什麼線索會讓你在這個方向上思考?由於基類大小變化而導致的調試崩潰

編輯1:更多細節。請假設有多個基類,例如base1,base2,base3等,每個基類都是在單獨的dll中派生的。 derived1.dll,derived2.dll和derived3.dll。沒有必要爲一個基類中的大小更改編譯所有其他項目。另外,製作依賴不是一種選擇,這就是我們經常遇到這個問題的原因。

+1

對「BaseClass」定義的更改應觸發對「DerivedClass」及其依賴項的重新編譯。爲什麼不發生這種情況? – 2011-12-23 07:06:23

回答

0

除了重新編譯之外,沒有任何傻瓜證明選項。如果發現哪些類是從您的class BaseClass派生出來的,那麼可以通過以下方式解決。

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

無論何時更改BaseClass大小,就如下:

class BaseClass : virtual FinalLock { 
    ... 
}; 

,並重新編譯整個項目。無論哪個類從BaseClass派生將導致編譯器錯誤(實際上,類的實例化將導致錯誤)。

這告訴你哪些類依賴於BaseClass。這個練習只需要一次。然後您可以標記所有的相關代碼。

完成後刪除這些額外的代碼。用C++ 11中,上述技術可製成仍然更容易:

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

方法之一將是固定以使所有從屬模塊是否重新編譯的依賴關係。這可能是共享庫的一個麻煩,但看看它是否不能直接修復。

方法二將始終「重建所有」。或者總是刪除obj目錄中的所有內容並構建。

方法三將添加一些調試模式代碼,用於檢查對象的大小並將它們與API邊界上的新調用進行比較,該邊界返回對象的大小。