Похоже, что массив, который поставляется с gcc 4.6, еще не имеет режима отладки. Понятно, поскольку поддержка C ++ 11 все еще экспериментальна.
Существует флаг _GLIBCXX_DEBUG
, который обычно используется для включения режима отладки. Если вы посмотрите на /usr/include/c++/4.6/debug/vector:313, то увидите, что operator[]
имеет:
__glibcxx_check_subscript(__n);
Теперь, это может быть супер-злым (и я имею в виду действительно злом), но похоже, что мы можем условно добавить это в массив. Измените строки 148-154 файла /usr/include/c++/4.6/array с:
reference
operator[](size_type __n)
{ return _M_instance[__n]; }
const_reference
operator[](size_type __n) const
{ return _M_instance[__n]; }
до:
reference
operator[](size_type __n)
{
#ifdef _GLIBCXX_DEBUG
__glibcxx_check_subscript(__n);
#endif
return _M_instance[__n];
}
const_reference
operator[](size_type __n) const
{
#ifdef _GLIBCXX_DEBUG
__glibcxx_check_subscript(__n);
#endif
return _M_instance[__n];
}
Это означает, что вы можете включить проверку границ для массива так же, как вы делаете для векторной и другой отладки stl - добавив -D_GLIBCXX_DEBUG
в строку компиляции. E.g.:
g++ someAwesomeProgram.cpp -D_GLIBCXX_DEBUG
Я только что посмотрел на транк gcc и, видимо, пока нет ссылки на _GLIBCXX_DEBUG для массива :(. http://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/include/std/array
Надеюсь, это не слишком далеко. Я предполагаю, что у нас будут безопасные итераторы и все это для массива в режиме отладки достаточно скоро. А пока это может быть нашим маленьким секретом: -).