std string的乙個隱蔽錯誤

2021-10-22 17:24:29 字數 1366 閱讀 1538

先看第乙個程式,for迴圈生成5個key,然後把它們對應的字串位址放入vector中,最後依次輸出字串。

#include

#include

#include

std::string genkey

(int i)

intmain()

for(

auto p : vec)

return0;

}

從**邏輯來說,應該會依次輸出5個不同的key才對,其實不然。

執行這段**,你會發現輸出是:

key000004

key000004

key000004

key000004

key000004

竟然輸出了5個一模一樣的key!

我們再來一下第二個程式,它與第乙個程式的唯一區別是,新增加了乙個vector儲存string型別的key。

#include

#include

#include

std::string genkey

(int i)

intmain()

for(

auto p : vec)

return0;

}

執行第二個程式,輸出:

key000000

key000001

key000002

key000003

key000004

這次輸出和預期的一樣了。

那第乙個程式出現了什麼錯誤呢?

這裡有乙個容易被忽視的錯誤:我們在for迴圈中定義的std::string key區域性變數, 每次迴圈完成後key都會被銷毀,那key對應的字串陣列當然也被釋放了!迴圈結束後vec中儲存的全是野指標,但是因為這些key分配的堆空間都在相同的位置,所以vec中他們指向了相同的位址,翻譯為字串,即是最後一次迴圈賦值的key000004!

在第二個程式中,雖然key仍然是區域性變數,但因為將他們存到了vector中,所以迴圈結束後,分配的堆空間也不會被釋放(這裡需要注意的一點是std::string型別是寫時複製的,即std::string型別間相互賦值,但只要沒有發生修改操作,它們底層的字串都指向了相同的位址)。

介紹乙個模擬std string的類

今天我們來編寫乙個模擬 c 標準庫中 std string 的類。大家都知道,在 c 標準庫中有乙個 string 類,提供了一系列字串相關的操作,簡潔 方便 可靠。但是,如果由於種種原因,我們無法得到 stl的支援怎麼辦?求人不如求己,讓我們自己設計乙個類 名為 mystring 模仿 std s...

乙個hibernate mapping的錯誤

在使用hibernate對映的時候 如果配置 onetomany cascade cascadetype.persist,fetch fetchtype.eager joincolumn name orderid referencedcolumnname order id private setbu...

乙個ModelSim報告的較為隱蔽的埠不匹配錯誤

錯誤資訊 error vsim 3389 port not found in the connected module 1st connection 原因 埠不對應!但是此次埠不對應的原因比較隱蔽 在quartus的.qsf中含有兩個同名但不同路徑的verilog原始檔,埠缺失的那個在前,埠完整的那...