【S13】vector和string優先於動態分配的記憶體

Andy Niu發表於2014-01-12

1、使用new動態分配記憶體,必須承擔如下責任:
  a、使用delete釋放記憶體;
  b、確保使用了正確的形式,delete與new的形式要匹配;
  c、不能重複delete。

2、使用vector和string可以消除以上的負擔。每當要動態分配一個陣列時,都要考慮使用vector和string替代。如果元素是字元char,使用string。否則使用vector。注意:有一種特殊情況,使用vector<char>更合理。

3、vector和string的元素分配在堆上,它們內部維護一個指標,指向堆上的元素。vector和string是深拷貝,會把元素逐個拷貝。

4、vector和string,它們自己管理記憶體,記憶體會自動增長,當它們析構時,會對每個元素逐個析構。

5、vector和string是功能完全的STL序列容器,可以使用很多STL功能。而陣列只支援部分STL演算法,沒有begin,end,size這樣的成員方法,也沒有iterator這樣的巢狀型別,因此STL更好用。

6、為了支援舊的程式碼,將vector和string轉化為陣列很簡單。

7、有一種特殊情況,需要考慮。string是如此常用,它的使用效率很重要。因此,STL中的string有可能是基於引用計數來實現的。這在多執行緒中,會出現衝突問題。如果string不是引用計數,而是整體拷貝,多執行緒就不會有問題,因為每個執行緒修改自己的副本。

8、對於基於引用計數的string,又執行在多執行緒環境下,有三種可行的選擇:a、禁止引用計數,這種做法不可移植;b、尋找一個不使用引用計數的string;c、考慮vector<char>,代替string。注意:VS2010中的STL,string沒有使用引用計數。

相關文章