为什么Xcode没有使用此代码崩溃?
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec(3);
cout << vec[4];
return 0;
}
答案 0 :(得分:3)
未定义的行为(这是)不保证会使您的程序崩溃。实际上没有定义做任何特定的事情。 它可能会崩溃。 它可能会被编译器删除。 它可能完全符合您的意图。 它可能会删除您的所有文件。 这意味着您的整个程序未定义,代码甚至可以参与时间旅行:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/
未定义。
编译器可能会警告您或它可能没有。 只是不这样做是你的责任。
您可以为clang和gcc编译器启用-Wall
和-Wextra
等标记,或为Visual Studio启用/W4
。那个可能让他们警告这个(和/或你可能正在做的其他愚蠢的事情)但是没有保证。您还可以使用clang-tidy(http://clang.llvm.org/extra/clang-tidy),Address Sanitizer(http://clang.llvm.org/docs/AddressSanitizer.html)等工具。未定义的行为清理程序(http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html)或Valgrind(http://valgrind.org/)或cppcheck(http://cppcheck.sourceforge.net/)可以帮助查找更多问题。但是仍然无法保证你会发现所有问题(虽然编译器警告和工具确实有帮助) - 有时你只需要知道你在做什么并且不写具有未定义行为的代码。正如其他人已经在评论中指出的那样,如果你想在越界条件下运行时异常;使用at()
成员函数(http://en.cppreference.com/w/cpp/container/vector/at)。