struct RelItem{ string segName; Elf32_Rel* rel; string relName; RelItem(string seg, int addr, string lb, int t); };
RelItem::RelItem(string seg, int addr, string lb, int t){
segName = seg;
relName = lb;
//rel = new Elf32_Rel(); //root cause
rel->r_offset = addr;
rel->r_info = t;
}
該string類型變量relName是類的最后一個成員變量,在此之前還有有兩個成員變量,分別是string類型和指針類型.
調試過程中發現在rel指針變量未new 新值的情況下,構造函數依然能夠正確返回,gdb調試發現rel變量並非空指針,
最終在打印relName的時候發現有亂碼,
懷疑是因為rel變量沒有分配新的內存空間,構造函數賦值的過程因為先賦值了后聲明的變量relName
導致rel指針也被賦值了一個隨機值,從而修改了其他變量的值導致打印錯亂.
如果我們將rel和relName的聲明順序調換下,構造函數不變,gdb調試的時候發現在
rel->r_offset = addr;
就會報告rel空指針異常,從而能夠提早發現問題
總結:
在構造函數對成員變量賦值的過程中,推測應該會按照成員變量聲明的順序分配空間,
因此如果指針變量(聲明順序靠前)在未賦值的情況下,會出現后賦值的變量因為需要分配空間,隨機分配了一個值給指針變量
從而導致gdb調試未能第一時間發現問題,影響后續調試以及程序運行結果