臨時物件的隱蔽性與野指標不崩之謎

2021-05-25 07:47:45 字數 499 閱讀 3448

c++危險眾所周知,專案中寫**寫得天昏地暗的時候就容易踩陷阱。不是我故意耍小聰明,是進度的緊迫性和頭腦的疲憊程度導致我寫了這樣的**(**經過簡單處理,隱去複雜性以及不涉密。^_^):

char* tmps=const_cast(string("hello").c_str());

cout《輸出什麼?"hello"。多悲劇的回答,答案是僅有乙個換行符而已。

因為臨時物件string在呼叫流的時候析構掉了!(這個結論最後有**驗證。)

所以這種情況就正常了:

cout<(string("hello").c_str())《疑問在繼續滋生。析構?那tmps指向的記憶體沒了,流呼叫的時候為何不會crash?對stl熟悉的朋友這時醒悟了,因為大部分string底層實現有用記憶體池。如果你模擬寫乙個string而不用記憶體池,保證連人帶機一起在老闆面前崩潰。況且,根據string的實現,如果緩衝用大了,string就不用記憶體池,另外再分配,這時記憶體用完了也會很快釋放,一樣會導致崩潰。

最後好戲終於上演:

臨時物件的產生與運用

所謂的臨時物件,就是一種無名物件。它的出現如果不在程式設計師的預期之下 例如,任何 pass by value操作都會引發copy操作,於是就形成了乙個臨時物件 這往往會造成效率上的負擔,但是在有些情況下,我們會刻意製造一些臨時物件,卻又會使程式乾淨清爽。刻意製造臨時物件的方法是,在型別名稱之後直接...

C 臨時量與臨時物件及程式的相關優化

一 臨時量與臨時物件 臨時量 內建型別生成的臨時量是常量 臨時量,暫存器帶出來 自定義型別生成的臨時量是變數 在記憶體中。隱式生成生成的臨時量是常量 顯式生成生成的臨時量是變數 臨時物件 臨時物件是系統臨時分配的物件,在沒主動宣告所需物件而又使用其功能時產生的 顯示物件 出現型別名 隱式物件 不出現...

物件的同一性與相等性

物件的相等性很好理解,就是兩個物件完全一樣,但是物件的同一性可能就不是很好理解了。不多說廢話,直接上 static void main string args console.writeline p1 p3 console.writeline p1.equals p3 console.read 結果...