天天看點

《從缺陷中學習C/C++》——6.4 臨時對象的生存期

本節書摘來自異步社群出版社《從缺陷中學習c/c++》一書中的第6章,第6.4節,作者: 劉新浙 , 劉玲 , 王超 , 李敬娜 , ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

從缺陷中學習c/c++

代碼示例

現象&結果

程式運作時通常是正常的,但有時會出錯,特别是在多線程時,會出現奇特的錯誤:例如,指針p指向的内容不是期望的内容。

bug分析

錯誤出在main函數中的const char *p = s1 + s2代碼行處。程式會首先生成一個臨時對象,用來存儲s1+s2的值,然後再把臨時對象的值賦給p,随後該臨時對象析構。是以,指針p指向了一塊非法記憶體。因為臨時對象已經被析構,是以這塊非法記憶體被系統識别為“未使用”的狀态,可以被再配置設定使用。如果在程式中沒有其他操作讀寫這塊記憶體時,其内容還沒有被改變,是以,可能輸出符合程式預期的正确結果。但是,沒有任何方法阻止那塊内容的改變。是以,如果有其他操作對這塊記憶體單元進行寫操作後,可能輸出的是随機值。

正确代碼

在main函數中顯式給出臨時對象:

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀