C++踩坑記錄(一)std:;string的析構


之前寫服務端程序有一個往消息隊列里面推json的過程,然后發現推進去C#端取到的無論如何都是個空指針 簡單復現一下現場

string str1 = string("hello1"); string str2 = string("hello2"); const char* ptr1 = str1.substr(1).data(); // 取字符串從下標1到結尾的部分 const char* ptr2 = str2.substr(1).data(); cout << ptr1 << ptr2 << endl;

這樣看起來輸出是ello1ello2的輸出,在我筆記本上面挺正常的,實際上我集成到服務器上面的時侯炸了,一直取到一組奇怪的字符串 跟蹤調試了一早上(雖然寫了3年C++工程,但是還是菜吧,折騰了好久)。 原來在str1.substr(1)創建了一個臨時對象存儲str1的子串。data()函數獲取了這個子串的內存指針。

執行到到了下一行的時候,存儲str1子串的字符串對象被析構,msvc發現這是個臨時對象,代碼塊還沒結束的十好幾就把內存析構掉,臨時對象的內存被釋放,同時str2.substr(1),這個時候新的臨時變量被注冊到剛才str1.substr(1)被析構掉的內存地址上面,此時再去調用data(),拿到了ptr1同一個地址的指針,此時內存的數據變更為s2的子串,然后壓到消息隊里面的數據穿就亂了,當我把程序增加一個臨時string去接收上面產生的子串的時候,問題就會解決了

string str1 = string("string1"); string str2 = string("string2"); string t_str1 = str1.substr(1); string t_str2 = str2.substr(1); const char* ptr1 = t_str1.data(); const char* ptr2 = t_str2.data(); cout << ptr1 << ptr2 << endl;


免責聲明!

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



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