2009-05-20 66 views
2

有人告訴我,用C++編程的最佳方式是使用STL和字符串,而不是數組和字符數組。如何在C++中使用數組會導致安全問題

vector<int> myInt; 

而不是

int myInt[20] 

不過,我不明白爲什麼後面會導致安全問題的理性。

+0

最佳情況是修改後的事實。談到速度,使用STL絕對不是最佳選擇。但是,封裝和類可以確保更好的穩定性。如果這就是你想要的。 – ralphtheninja 2009-05-20 08:19:28

+0

「最佳」是由Bjarne Stroustrup創造的一個術語。他還聲稱STL的開銷很小。 http://www.research.att.com/~bs/bs_faq.html – segfault 2009-05-20 08:24:07

回答

9

我建議你閱讀buffer overruns,然後。在使用原始數組時,程序員創建緩衝區溢出的風險更大,因爲它們會減少保護並且不提供API。當然,也可以使用STL在腳下拍攝自己,但至少它更難。

+1

「...但在C++中,它吹你的腿」 - Stroustrup – 2009-05-20 08:28:33

1

C++數組在插入或讀取時不執行邊界檢查,而且很容易從數組邊界外意外訪問項。

從面向對象的角度來看,向量也有更多的關於自己的知識,所以可以照顧自己的家務。

2

數組不執行綁定檢查。因此它們很容易受到bound checking errors的影響,這很難被發現。

注意:以下代碼有編程錯誤。

int Data[] = { 1, 2, 3, 4 }; 
int Sum = 0; 

for (int i = 0; i <= 4; ++i) Sum += Data[i]; 

使用這樣的數組,你不會得到幫助你找到錯誤的異常;只有不正確的結果。

數組不知道他們自己的大小,而vector定義了beginend訪問其元素的方法。對於數組,你總是必須依賴指針算術(因爲它們只是指針,你可以不經意地投它們)

+0

向量不執行邊界檢查,除了可能調試模式與一些供應商的庫。這當然不是矢量合同。 – 2009-05-20 08:39:56

0

你的例子有一個固定數量的項目的靜態數組;取決於您的算法,這可能與具有固定數量項目的向量一樣安全。

然而,作爲一個經驗法則,當你想動態地分配一個項目數組時,向量要容易得多,並且可以減少錯誤。任何時候你必須思考,有可能會發現一個可能被利用的bug。

4

這裏似乎存在一些關於什麼安全向量可以和不能提供的困惑。忽略迭代器的使用,有三種主要的方法來訪問vector中的元素。

  • 向量的運算符[]的功能 - 這提供無邊界檢查,並將 結果在上界失誤不確定的行爲,以同樣的方式爲數組會,如果你使用一個無效的索引。

  • 所述()向量成員函數 - 這提供了邊界檢查和將引發一個例外,如果使用了無效的索引,以小的性能成本

  • 的C++操作符[]爲向量的基礎數組 - 這不會提供邊界檢查,但會提供最高的訪問速度。

相關問題