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