在使用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 ...