Разница между std :: tr1 :: array и boost :: array - PullRequest
3 голосов
/ 23 июня 2010

У меня сложилось впечатление, что std :: tr1 :: array - это то же самое, что и boost :: array, потому что он вызывает исключение при доступе к индексу за пределами границ.На самом деле, я заглянул в шапку, и это выглядит так же.Может кто-нибудь объяснить, почему следующий код приводит к ошибке шины (gcc версии 4.0.1 (Apple Inc., сборка 5465)) и segfault на gcc 4.1.2?

Ответы [ 2 ]

3 голосов
/ 23 июня 2010

Это может быть ошибка в вашей установленной версии компилятора.Вот что GCC делает для вашего кода в моей системе (Linux x86-64):

$ g++-4.1.2 test.cpp -o test
$ ./test
exception: array::_M_at
$ g++-4.3.5 test.cpp -o test
$ ./test
exception: array::at
$ g++-4.4.4 test.cpp -o test
$ ./test
exception: array::at
$ g++-4.5.0 test.cpp -o test
$ ./test
exception: array::at

Так что, похоже, это работает по всем направлениям, и, в частности, говорит о том, что он работает правильно на моей машине с GCC4.1.2 где это не получается с твоим.Вы пытались получить трассировку стека в момент сбоя?Valgrind также может быть полезным.

0 голосов
/ 23 июня 2010

Вы выделяете массив из 3 элементов (array<std::string, 3>), но пытаетесь получить доступ к 4-му элементу (arr.at(3)). boost :: array выполняет проверку границ с утверждением. Я не уверен насчет tr1 :: array, но если вы читаете (черновик) C ++ 0x Standard, он не требует, чтобы array::operator[]() выбрасывал за пределы указателей. Поэтому я предполагаю, что ваша реализация tr1 :: array ведет себя аналогично, чтобы boost :: array (поднимая утверждение в отладочных сборках, ничего не делая в релизных сборках). Это объясняет «ошибку шины» / «segfault» в вашем тестовом коде.

...