2017-01-21 46 views
0

我有下一個代碼段。這個想法是,矢量有5個項目,我通過運營商[]訪問100,這應該導致崩潰。但正如你在輸出中看到的那樣。行爲[]

#include <vector> 
#include <iostream> 

int main() { 
    std::vector<int> vec(5, 1); 
    vec[100] = 25; 
    std::cout << "vec[100] = " << vec[100] << ", vec[99] = " << vec[99] << 
     ", vector size = " << vec.size() << 
     ", vector capacity = " << vec.capacity() << std::endl; 
} 

輸出:

vec[100] = 25, vec[99] = 0, vector size = 5, vector capacity = 5 

編譯標誌:

clang++ -W -Wall -std=c++14 -stdlib=libc++ vector_over_flow_test.cpp -o vector_overflow_test.bin 

鏘版本:

$clang++ --version 
Apple LLVM version 8.0.0 (clang-800.0.42.1) 
Target: x86_64-apple-darwin16.3.0 
Thread model: posix 
InstalledDir: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

根據cpp reference

返回在指定的位置POS一個參考元件。不執行邊界檢查。

它是在實現中的錯誤?

+2

你甚至引用文檔「無邊界檢查執行」,但你似乎期望編譯器實際上將檢查邊界,然後崩潰,如果是出界 –

+1

*它是在執行中的錯誤?* - 要嚴重現在。你真的認爲世界各地成千上萬的人使用的編譯器會讓這個簡單的東西錯誤嗎?當然,這不是一個執行問題 - 如果是的話,'鐺'將被從業務中嘲笑。 – PaulMcKenzie

+0

如果你想檢查'std :: vector'的邊界,那麼你可以用特殊的編譯器標誌打開它。由於它是未定義的行爲,編譯器可以自由地爲您提供此選項。請參閱http://stackoverflow.com/questions/16467380/bounds-checking-of-stdvector-and-other-containers-in-clang作爲起點。 –

回答

8

這應該導致崩潰

號這只是undefined behavior。這些實現不需要崩潰;任何事情都是可能的,包括看起來很好。請注意,你不應該依賴它。

另一方面,std::vector::at確實會執行邊界檢查,而std::out_of_range會在退出邊界時被拋出。

3

它不是根據你引用文檔中的錯誤:

返回在指定位置POS一個參考因素。不執行邊界檢查。

這是幸​​運的,它不會崩潰並正常工作。