一例析構順序造成的錯誤

2021-04-07 06:59:50 字數 721 閱讀 4216

類中成員變數定義的順序會有什麼影響?

應該是沒有,平時誰會去注意下面**中m_***, m_yyy的先後次序呢?

class c***;

class cyyy;

class czzz;

其實是有區別的,就是定義順序造成析構順序不同。

本例就是實際debug過程中發現的析構順序造成的錯誤。(vc環境)

**中m_yyy的析構早於m_***(與構造順序相反),

若m_***儲存了m_yyy的乙個指標m_py, 並在析構過程中引用該指標就會有意外。

c***x::~c***x()

m_py所指向的物件已經析構,雖然呼叫一般不會報錯,但結果錯誤的。

m_yyy析構以後的簡單成員變數會保持原值,但如std::string這樣的複雜變數已清空。

解決方法:

改變定義順序雖可消除錯誤,其實應該改變流程,使析構順序與行為無關。

如不要在析構方法中引用可能已無效的指標,可改為顯示呼叫。

debug心得:

實際**遠非如此簡單,指標的傳遞層次較多。現象為乙個string無故變空。

不知道如何設定斷點,所有賦值語句都禁掉還是自動變化。

vc的資料斷點也不靈。

在錯誤無法定位時,首先要設法使錯誤容易復現。

通過縮小測試資料的規模,只保留使錯誤重現的最小資料集,然後再跟蹤除錯。

測試資料縮小後,僅跟蹤執行了幾次就發現變數改變的點在析構函式上。

DBA ERRORS錯誤一例

資料庫版本10.2.0.4 首先這個東西記錄了pl sql的一些錯誤資訊,具體含義大家自己網上查查吧 其實這個錯誤是接著上次expdp的時候出現的,上次執行的指令碼 oracle home rdbms admin catmet2.sql oracle home rdbms admin utlrp.s...

DBA ERRORS錯誤一例

資料庫版本10.2.0.4 首先這個東西記錄了pl sql的一些錯誤資訊,具體含義大家自己網上查查吧 其實這個錯誤是接著上次expdp的時候出現的,上次執行的指令碼 oracle home rdbms admin catmet2.sql oracle home rdbms admin utlrp.s...

子類的析構順序

派生類的析構函式的功能是在該物件消亡之前進行一些必要的清理工作,析構函式沒有型別,也沒有引數。析構函式的執行順序與建構函式相反,無需指明析構關係,因為析構函式只有一種,無過載,無默參 析構順序 子類 成員 基類 include stdafx.h include using namespace std...