• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            focus on linux, c/c++, lua

            糊涂的午后:返回臨時對象

            前兩天寫代碼的時候,大概有這樣的一個需求,就是在一個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
            的時候,也不會調用類的析構函數。

            posted on 2010-07-03 16:19 zuhd 閱讀(410) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

            天天躁日日躁狠狠久久| 久久精品国产一区二区电影| 99久久国产综合精品女同图片| 久久这里有精品视频| 久久亚洲AV成人无码电影| 久久亚洲国产欧洲精品一| 欧美日韩精品久久免费| 久久久av波多野一区二区| 久久久久国产精品嫩草影院| 久久精品国产精品亚洲精品| 亚洲国产精品久久久久久| 亚洲中文字幕无码一久久区| 亚洲国产精品婷婷久久| 亚洲国产精品一区二区久久hs| 国产91久久综合| 97久久超碰国产精品2021| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 久久精品国产99久久丝袜 | 狠狠色丁香久久婷婷综合五月| 色偷偷888欧美精品久久久| 久久无码人妻一区二区三区午夜| 久久e热在这里只有国产中文精品99 | 亚洲AV日韩精品久久久久| 久久激情亚洲精品无码?V| 久久国产精品久久久| 久久亚洲美女精品国产精品| 怡红院日本一道日本久久 | 久久精品中文字幕有码| 久久综合丁香激情久久| 国产精品美女久久久久网| 久久国产免费直播| 久久久久99这里有精品10| 久久精品国产72国产精福利| 曰曰摸天天摸人人看久久久| 精品久久久久久国产潘金莲| 国产成人久久精品一区二区三区 | 国产高潮国产高潮久久久91 | 久久人人爽人人人人爽AV| 无码人妻久久一区二区三区蜜桃 | 奇米影视7777久久精品人人爽 | 久久久久久国产精品免费免费 |