簡體   English   中英

成員順序,派生順序有關系嗎?

[英]Order of members, order of derivation matters?

有時我碰到過這個問題,每當我更改成員的順序,C ++類中的派生順序時,問題都會得到解決,崩潰會得到解決。

最近,我將私有成員變量的位置從班級的較低位置移到了班級頂部,並且錯誤已得到解決。

還有一次我有A類:公共B,公共C。當我將其更改為A類:公共C,公共B時,崩潰代碼開始起作用。 C是包含虛擬方法的類,在前一種情況下,類A找不到C中重寫的方法,但在后來的情況下,它可以找到。 這是由於虛擬指針損壞嗎? 如果是這樣,那與會員順序有什么關系? 我知道更改成員順序時內存布局會發生變化,但是我們如何調試此類問題,因為在VS2008中我找不到任何有關崩潰發生原因的指示?

注意:基類B和C完全獨立,彼此之間沒有依賴關系

基類和成員對象按聲明順序(而不是初始化列表的順序)初始化。

如果其中一個基址接收到指向另一個基址對象的指針,並且除了將指針存儲以供以后在其構造函數中使用外,其他任何操作,那么ctor將訪問尚未構造的對象。

在MSVC / VS下使用/W3警告級別,應在this其傳遞到指向尚未初始化的對象的一部分的基本ctor以及將初始值設定項列表改組以匹配聲明順序時發出警告。

可能性:

  • 您沒有重新編譯所有源代碼,因此標頭不同步。
  • 您在某個地方毀滅了所有史詩般的未定義行為。

調試步驟:

  • 通過靜態分析工具運行
  • 在調試模式下完全重建
  • 通過調試器運行
  • 通過動態分析工具運行

可能是您定義了一個數組:int A [M]。 M小於您在代碼中使用的M。 我今天也有這個麻煩。 我定義了布爾mMyArray [6];

但是,在我的代碼中,我在某處使用了mMyArray [7] = false;。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM