有人告訴我,用C++編程的最佳方式是使用STL和字符串,而不是數組和字符數組。如何在C++中使用數組會導致安全問題
即
vector<int> myInt;
而不是
int myInt[20]
不過,我不明白爲什麼後面會導致安全問題的理性。
有人告訴我,用C++編程的最佳方式是使用STL和字符串,而不是數組和字符數組。如何在C++中使用數組會導致安全問題
即
vector<int> myInt;
而不是
int myInt[20]
不過,我不明白爲什麼後面會導致安全問題的理性。
我建議你閱讀buffer overruns,然後。在使用原始數組時,程序員創建緩衝區溢出的風險更大,因爲它們會減少保護並且不提供API。當然,也可以使用STL在腳下拍攝自己,但至少它更難。
「...但在C++中,它吹你的腿」 - Stroustrup – 2009-05-20 08:28:33
C++數組在插入或讀取時不執行邊界檢查,而且很容易從數組邊界外意外訪問項。
從面向對象的角度來看,向量也有更多的關於自己的知識,所以可以照顧自己的家務。
數組不執行綁定檢查。因此它們很容易受到bound checking errors的影響,這很難被發現。
注意:以下代碼有編程錯誤。
int Data[] = { 1, 2, 3, 4 };
int Sum = 0;
for (int i = 0; i <= 4; ++i) Sum += Data[i];
使用這樣的數組,你不會得到幫助你找到錯誤的異常;只有不正確的結果。
數組不知道他們自己的大小,而vector
定義了begin
和end
訪問其元素的方法。對於數組,你總是必須依賴指針算術(因爲它們只是指針,你可以不經意地投它們)
向量不執行邊界檢查,除了可能調試模式與一些供應商的庫。這當然不是矢量合同。 – 2009-05-20 08:39:56
你的例子有一個固定數量的項目的靜態數組;取決於您的算法,這可能與具有固定數量項目的向量一樣安全。
然而,作爲一個經驗法則,當你想動態地分配一個項目數組時,向量要容易得多,並且可以減少錯誤。任何時候你必須思考,有可能會發現一個可能被利用的bug。
這裏似乎存在一些關於什麼安全向量可以和不能提供的困惑。忽略迭代器的使用,有三種主要的方法來訪問vector中的元素。
向量的運算符[]的功能 - 這提供無邊界檢查,並將 結果在上界失誤不確定的行爲,以同樣的方式爲數組會,如果你使用一個無效的索引。
所述()向量成員函數 - 這提供了邊界檢查和將引發一個例外,如果使用了無效的索引,以小的性能成本
的C++操作符[]爲向量的基礎數組 - 這不會提供邊界檢查,但會提供最高的訪問速度。
最佳情況是修改後的事實。談到速度,使用STL絕對不是最佳選擇。但是,封裝和類可以確保更好的穩定性。如果這就是你想要的。 – ralphtheninja 2009-05-20 08:19:28
「最佳」是由Bjarne Stroustrup創造的一個術語。他還聲稱STL的開銷很小。 http://www.research.att.com/~bs/bs_faq.html – segfault 2009-05-20 08:24:07