vector的clear操作的內部過程

2021-07-04 20:09:28 字數 3089 閱讀 3767

在使用clear時遇到了一些問題,看到網上的資料,寫的很不錯~我也學習到很多。

要注意vector儲存指標的問題。最終還是要使用delete依次釋放才行。

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

[cpp]view plain

copy

class

test  

~test()   

};  

intmain()    

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

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

[cpp]view plain

copy

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

void

clear()   

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

iterator erase(iterator first, iterator last)   

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

[cpp]view plain

copy

// destroy()單指標版本

template

<

class

t>  

inline

void

destroy(t* pointer)   

// destroy()兩迭代器版本

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

template

<

class

forwarditerator>  

inline

void

destroy(forwarditerator first, forwarditerator last)   

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

template

<

class

forwarditerator, 

class

t>  

inline

void

__destroy(forwarditerator first, forwarditerator last, t*)   

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

template

<

class

forwarditerator>  

inline

void

__destroy_aux(forwarditerator first, forwarditerator last, __false_type)   

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

template

<

class

forwarditerator>   

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

<

class

t1, 

class

t2>  

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操作的內部過程

最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?class test test int main 同時最近又看到一道面試題 對於stl中的vector呼叫clear時,內部是如何操作的?若想將其記憶體釋放,該如何操作?針對以上兩個問題,我們追蹤一下...

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 ...