2010-06-23 3 views
3

std :: tr1 :: array는 boost :: array와 같았으므로 인덱스에 액세스 할 때 예외가 발생합니다 출입 금지 구역의. 사실, 나는 머리글을 들여다 보았다. 누군가 다음과 같은 코드가 버스 오류 (gcc 버전 4.0.1 (Apple Inc. build 5465)) 및 gcc 4.1.2의 segfault를 초래하는 이유를 설명 할 수 있습니까?std :: tr1 :: array와 boost :: array의 차이점

감사합니다.

#include <exception> 
#include <iostream> 
#include <string> 
#include <tr1/array> 
#include <boost/array.hpp> 

int main() 
{ 
    // boost::array<std::string, 3> arr; 
    std::tr1::array<std::string, 3> arr; 
    try 
    { 
     arr.at(0) = "one"; 
     arr.at(1) = "two"; 
     arr.at(2) = "three"; 
     arr.at(3) = "nogood"; 
    } 
    catch (const std::exception& e) 
    { 
     std::cout << "exception: " << e.what() << std::endl; 
    } 
    return 0; 
} 
+0

난 그냥 gcc 4.1.2와 그것을 시도하고 예상되는 예외가있어. 이것이 정확한 코드일까요? –

답변

3

특정 설치된 버전의 컴파일러에서 버그 일 수 있습니다. 다음은 GCC 내 시스템에 코드 (리눅스 - 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 

그래서이 보드에서 작동하는 것, 그리고 특히이 GCC 4.1 내 컴퓨터에서 제대로 작동하는 것 같다 것을 말하고있다. 2 너와 함께 실패한 곳. 충돌 지점에서 스택 백 트레이스를 얻으려고 했습니까? Valgrind도 도움이 될 수 있습니다.

0

3 개의 요소 (array<std::string, 3>)의 배열을 할당하고 있지만 네 번째 요소 (arr.at(3))에 액세스하려고합니다. boost :: array는 assertion으로 검사를 수행한다. tr1 :: array에 대해서는 잘 모르겠지만 (초안) C++ 0x Standard를 읽는다면 array::operator[]()이 필요하지 않습니다. 그래서 tr1 :: array의 구현이 boost :: array (디버그 빌드에서 어설 션을 제기하고 릴리즈 빌드에서는 아무 것도하지 않음)와 비슷하게 동작한다고 가정합니다. 이렇게하면 테스트 코드에서 '버스 오류'/ 'segfault'가 설명됩니다.

+2

'at'는 인덱스를 검사하고 필요하다면 그것을 구현하는 모든 표준 시퀀스 컨테이너에 대해'out_of_range'를 던져야합니다. 'boost :: array <> :: at'도 똑같습니다. –

+0

그래, 나는 정정을 세웠다. 나는 어떻게 든 연산자 []와 at()를 섞었다. – hkaiser

관련 문제