2016-03-22 16 views
-2

Neden Xcode bu kodla kilitleniyor?Xcode vektörel altyazı üzerinde kilitlenmiyor aralık dışı

#include <iostream> 
#include <vector> 
using namespace std; 
int main(){ 
    vector<int> vec(3); 
    cout << vec[4]; 
    return 0; 
} 
+1

Bu tanımlanmamış bir davranış. Çarpmak zorunda değil. Kendini fark edebilir ve dünyayı ele geçirebilir. – NathanOliver

+0

Vektörlerinizde sınırları kontrol etmek istiyorsanız, 'vec [4]' yerine 'vec.at (4)' kullanın. Sonra sınırların dışında bir istisna atar. Aksi takdirde, C++ 'da kullanmadığınız şey için ödeme yapmazsınız. –

cevap

3

Tanımsız davranışınız (ki bu) programınızı çökertmek için garanti edilmez. Aslında belirli bir şey yapmak için tanımlanmamıştır. Bu çökebilir. Derleyici tarafından silinebilir. Amaçladığınız şeyi tam olarak yapabilir. Tüm dosyalarınızı silebilir. tüm programı tanımsız ve kod hatta zamanda yolculuk meşgul olabileceğini Anlamı şu: https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/

O tanımsız olduğunu.

Derleyici bu konuda sizi uyarabilir veya olmayabilir. Sadece numaralı telefondan sorumlu değilsiniz..

Clang ve gcc derleyicileri için -Wall ve -Wextra veya Visual Studio için /W4 gibi bayrakları etkinleştirebilirsiniz. Bu ,'un bu konuda (ve/veya yaptığınız diğer aptalca şeyleri) uyarmasına neden olabilir, ancak hiçbir garanti yoktur. Ayrıca Sanitizer (http://clang.llvm.org/docs/AddressSanitizer.html) & Tanımsız Davranış Temizleyici (http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) ya da Valgrind (http://valgrind.org/) ya da daha fazla sorunları bulmanıza yardımcı olabilir cppcheck (http://cppcheck.sourceforge.net/) Adres böyle clang-düzenli (http://clang.llvm.org/extra/clang-tidy) gibi araçlar kullanabilirsiniz. Ama yine de tüm problemleri bulacağınıza dair bir garanti yoktur (derleyici uyarıları ve araçları yardımcı olsa da) - bazen sadece 'a ne yaptığınızı biliyorsunuz ve undefined davranışları ile kod yazmayın. Ve diğerlerinin yorumlarda zaten belirttiği gibi, sınır dışı koşullarında çalışma zamanı istisnaları istiyorsanız; at() üye işlevini kullanın (http://en.cppreference.com/w/cpp/container/vector/at).

+0

Programın beni uyarmasını istiyorsam ne yapmam gerekir? Belki bazı derleme bayrakları eklemeliyim? – Subirdcom

+0

@Subirdcom Güncellenmiş cevabın buna cevap verdiğini düşünüyorum. Bu konuda hala net değil misiniz yoksa cevabı kabul edebilir misiniz? –