前兩天寫代碼的時(shí)候,大概有這樣的一個(gè)需求,就是在一個(gè)hash_map中查找一個(gè)對(duì)象,有的就返回,沒(méi)有的話就返回空對(duì)象。恰好這個(gè)對(duì)象是std::vector。
我今天看了下代碼,居然代碼是這樣寫的
VECTOR& GetElement(TYPE key)
{
VECTOR vecTmp;
if (find)
{
vecTmp = value;
}
return vecTmp;
}
大概的意思就是找到這個(gè)值就返回它的value,一個(gè)長(zhǎng)度不為0的vector,如果找不到,就返回一個(gè)空的vector。很明顯這樣做,始終是返回一個(gè)空的vector。
因?yàn)関ecTmp是一個(gè)臨時(shí)對(duì)象,它退出生命空間的時(shí)候,會(huì)被析構(gòu),然后把析構(gòu)過(guò)的對(duì)象再傳給一個(gè)臨時(shí)對(duì)象,也就是你的值。盡管在傳值的時(shí)候,程序不會(huì)
崩潰,盡管棧已經(jīng)回收,但是vecTmp還是把它的內(nèi)容傳給了一個(gè)臨時(shí)的對(duì)象。
正確的做法應(yīng)該是在參數(shù)中做左值傳遞。
void GetElement(TYPE key, VECTOR& vec);
哎,太熱了,這樣的錯(cuò)誤都能犯,服了你了!
2010-1008添加:
關(guān)于在容器中保存實(shí)例還是指針的問(wèn)題,保存實(shí)例,在push_back的時(shí)候因?yàn)槭侵祩鬟f,會(huì)產(chǎn)生臨時(shí)對(duì)象,那么就會(huì)多一次臨時(shí)對(duì)象的創(chuàng)建和析構(gòu),且在vector
調(diào)用clear的時(shí)候,要調(diào)用每個(gè)實(shí)例的析構(gòu)函數(shù)。如果保存指針,那也就是4個(gè)字節(jié)的int變量,不存在臨時(shí)變量,構(gòu)造函數(shù),析構(gòu)函數(shù)等等問(wèn)題,而且即使在clear
的時(shí)候,也不會(huì)調(diào)用類的析構(gòu)函數(shù)。