vector的clear操作的內部過程

2021-06-13 12:55:37 字數 2241 閱讀 1031

最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?

class test

~test() };

int main()

同時最近又看到一道面試題:對於stl中的vector呼叫clear時,內部是如何操作的?若想將其記憶體釋放,該如何操作?

針對以上兩個問題,我們追蹤一下stl原始碼。

// 清除全部元素。注意並未釋放空間,以備可能未來還會新加入元素。

void clear()

//呼叫vector::erase的兩迭代器範圍版本

iterator erase(iterator first, iterator last)

以上關鍵就是呼叫了destroy函式。destory函式在 中定義,為了便於分析整個的構造與釋放,將construct函式的內容也進行了摘錄。這其中要注意的是traits技術。

// destroy()單指標版本

template inline void destroy(t* pointer)

// destroy()兩迭代器版本

//利用 __type_traits<> 求取最適當措施。

template inline void destroy(forwarditerator first, forwarditerator last)

//判斷元素的數值型別(value type)有 non-trivial destructor(自定義析構函式)

template inline void __destroy(forwarditerator first, forwarditerator last, t*)

// 如果元素的數值型別(value type)有 non-trivial destructor(自定義析構函式)

template inline void

__destroy_aux(forwarditerator first, forwarditerator last, __false_type)

//如果元素的數值型別(value type)有trivial destructor

template inline void __destroy_aux(forwarditerator, forwarditerator, __true_type) {}

//什麼都不做,stl是用了一種保守的方式,只有內建的元素型別(int,float等)進行判定trivial destructor的時候才是__true_type其他一切使用者自定義型別都是__false_type

// destroy()兩迭代器版本,針對char*與wchar_t*的特化版本

inline void destroy(char*, char*) {}

inline void destroy(wchar_t*, wchar_t*) {}

//僅僅是對placement new 的一層封裝

template inline void construct(t1* p, const t2& value)

看到這裡基本對上述的問題已經有答案了。

由於物件的指標不是內建物件,所以進行遍歷析構。

for ( ; first //

遍歷元素進行析構

destroy(&*first);                 //!!!!!

關鍵句!!!!!!!!!

*iterator是元素型別,&*iterator是元素位址,也就是乙個指標。之後呼叫&*iterator->~t();所以可知當vector中所儲存的元素為物件的時候,呼叫clear()操作的時候系統會自動呼叫析構函式。但是當儲存元素是指標的時候,指標指向的物件就沒法析構了。因此需要釋放指標所指物件的話,需要在clear操作之前呼叫delete。

for(i= 0; i

delete vitem[i];

下面進行一下測試

為什麼呼叫了6次析構函式?(提示,vector的動態增長。)參見我的部落格:vector的構造與記憶體管理。

vector的clear操作的內部過程

在使用clear時遇到了一些問題,看到網上的資料,寫的很不錯 我也學習到很多。要注意vector儲存指標的問題。最終還是要使用delete依次釋放才行。最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?cpp view plain copy clas...

vector的clear 和swap 比較

假設有若干物件存於乙個 vector 中 class widget vector vw 後來由於某些原因,從該容器中刪除了若干物件 參考erase remove idiom 對於 vector 和 string 來講,erase 和 clear 並不會改變容器的capacity,也就不會改變他們的記...

vector記憶體清理情況 clear和swap

光clear是不釋放記憶體的,將你這段 修改了一下,你看看,應該能明白了,不明白執行一下就知道了。include include using namespace std main cout 未放元素時容器大小為 it.size 容器容量為 it.capacity endl 未放元素 for int ...