c++ string類型成員變量在調用構造函數后未能正確賦值


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調試未能第一時間發現問題,影響后續調試以及程序運行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM