我有下一個代碼段。這個想法是,矢量有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
返回在指定的位置POS一個參考元件。不執行邊界檢查。
它是在實現中的錯誤?
你甚至引用文檔「無邊界檢查執行」,但你似乎期望編譯器實際上將檢查邊界,然後崩潰,如果是出界 –
*它是在執行中的錯誤?* - 要嚴重現在。你真的認爲世界各地成千上萬的人使用的編譯器會讓這個簡單的東西錯誤嗎?當然,這不是一個執行問題 - 如果是的話,'鐺'將被從業務中嘲笑。 – PaulMcKenzie
如果你想檢查'std :: vector'的邊界,那麼你可以用特殊的編譯器標誌打開它。由於它是未定義的行爲,編譯器可以自由地爲您提供此選項。請參閱http://stackoverflow.com/questions/16467380/bounds-checking-of-stdvector-and-other-containers-in-clang作爲起點。 –