int main(int argc, char *argv[]){ int array[5]={1,3,2,5,4};vector<int> v(array,array+5); //sort(v);sort(v.begin(),v.end());v.clear() ; ?? 我這里都清空了啊 cout<<v[0];?? 這里為什么還能取出來值呢 system("PAUSE");return EXIT_SUCCESS;}
2 回答

慕田峪9158850
TA貢獻1794條經驗 獲得超7個贊
因為對于vector,clear并不真正釋放內存(這是為優化效率所做的事),clear實際所做的是為vector中所保存的所有對象調用析構函數(如果有的話),然后初始化size

largeQ
TA貢獻2039條經驗 獲得超8個贊
vector,clear()并不真正釋放內存(這是為優化效率所做的事),clear實際所做的是為vector中所保存的所有對象調用析構函數(如果有的話),然后初始化size這些東西,讓覺得把所有的對象清除了。
真正釋放內存是在vector的析構函數里進行的,所以一旦超出vector的作用域(如函數返回),首先它所保存的所有對象會被析構,然后會調用allocator中的deallocate函數回收對象本身的內存。
所以,某些編譯器clear后還能訪問到對象數據(因為它根本沒清除),在一些比較新的C++編譯器上(例如VS2008),當進行數組引用時(例如a[2]這種用法),STL庫中會有一些check函數根據當前容器的size值來判斷下標引用是否超出范圍,如果超出,則會執行這樣一句:
_THROW(out_of_range, "invalid vector<T> subscript");
即拋出一個越界異常,clear后沒有捕獲異常,程序在新編譯器編譯后就會崩潰掉。
- 2 回答
- 0 關注
- 407 瀏覽
添加回答
舉報
0/150
提交
取消