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