我用std::array
替換了一箇舊的樣式數組,但後來我意識到編譯器(至少MSVC)正在執行更少的邊界檢查。考慮下面的代碼:爲什麼MSVC編譯器沒有檢測到std :: array出邊界訪問
double myArray[10];
myArray[11] = 3.0;
std::array<double,10> myStdArray;
myStdArray[11] = 3.0;
佛myArray的,警告報告:
警告C4789:大小80個字節將被溢出的緩衝 'myArray的';將從偏移量開始寫入8個字節88
對於myStdArray
,根本沒有報警。
這是編譯器中的「bug」還是std::array
的實現方式不允許報告這種警告?如果是這樣,是否值得使用std::array
,這裏似乎不太安全......
如果您的索引在編譯時已知,則可以使用'std :: get'來獲得編譯時錯誤。 – krzaq
C++從來沒有對任何類型的數組進行邊界檢查,它永遠不會。如果你想邊界檢查你應該使用['at'](http://en.cppreference.com/w/cpp/container/array/at)。儘管我在大多數情況下建議使用普通C數組的'std :: array',但不是爲了「安全」,而是爲了易用性。 –
編譯器無法看到'std :: array'的內部實現,甚至不能看到足以提供與本地數組相同的消息的合約。 – EJP