2 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
因?yàn)閷?duì)于vector,clear并不真正釋放內(nèi)存(這是為優(yōu)化效率所做的事),clear實(shí)際所做的是為vector中所保存的所有對(duì)象調(diào)用析構(gòu)函數(shù)(如果有的話),然后初始化size

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
vector,clear()并不真正釋放內(nèi)存(這是為優(yōu)化效率所做的事),clear實(shí)際所做的是為vector中所保存的所有對(duì)象調(diào)用析構(gòu)函數(shù)(如果有的話),然后初始化size這些東西,讓覺(jué)得把所有的對(duì)象清除了。
真正釋放內(nèi)存是在vector的析構(gòu)函數(shù)里進(jìn)行的,所以一旦超出vector的作用域(如函數(shù)返回),首先它所保存的所有對(duì)象會(huì)被析構(gòu),然后會(huì)調(diào)用allocator中的deallocate函數(shù)回收對(duì)象本身的內(nèi)存。
所以,某些編譯器clear后還能訪問(wèn)到對(duì)象數(shù)據(jù)(因?yàn)樗緵](méi)清除),在一些比較新的C++編譯器上(例如VS2008),當(dāng)進(jìn)行數(shù)組引用時(shí)(例如a[2]這種用法),STL庫(kù)中會(huì)有一些check函數(shù)根據(jù)當(dāng)前容器的size值來(lái)判斷下標(biāo)引用是否超出范圍,如果超出,則會(huì)執(zhí)行這樣一句:
_THROW(out_of_range, "invalid vector<T> subscript");
即拋出一個(gè)越界異常,clear后沒(méi)有捕獲異常,程序在新編譯器編譯后就會(huì)崩潰掉。
- 2 回答
- 0 關(guān)注
- 418 瀏覽
添加回答
舉報(bào)