2010-12-20 2 views
1

많은 양의 데이터 배열을 메모리 (비) 할당을 관리하기 위해 stl 벡터를 광범위하게 사용하고 있습니다. 특히 저는 여러 각도 (180도에서 2도 단계)에서 해부학 적 구조의 투시 투영법을 생성하고 결과를 처리하고 분석합니다. 결과는 방사선 치료를위한 방사선 필드를 정의하는 데 사용됩니다.C++ stl 벡터로 인해 메모리 오버플로가 발생합니까?

배열이 특정 크기 (> 3 해부 구조)를 초과하면 메모리가 오버플로되는 것 같습니다. M_range_check

벡터 :: _이 검사 범위를 않는에서 사용의 결과입니다 :

가 '표준 : : out_of_range' 무엇을()의 인스턴스를 던지는 후 호출 종료 다음과 같이 특히 오류입니다 , 더 빠른 [] 연산자가 아닙니다. < = 3 구조가 있으면 오류가 발생하지 않습니다.

나는 다음과 같은 코드 블록에 아래 오류를 추적

bool dicomCP::assignBeamlet(int beamletNumber, Beamlet &b1) 
{ 
//std::cout << "\nInside dicomCP::assignBeamlet (int, Beamlet &)\n"; 

    if (!this->isSet) 
    { 
    this->beamlets.at(beamletNumber).setLeftRight(b1.left,b1.right); 

    this->isSet=true; 

    return true; 


    } 

    else if (!this->beamlets.at(beamletNumber-1).isOpen()) 
    { 

    return false; 

    } 

    // left (outside) min(left) and right (outside) max(right) leaves 
    else if ((this->beamlets.at(beamletNumber-1).right-b1.left >EPSILON2)&&(b1.right-this->beamlets.at(beamletNumber-1).left>EPSILON2)) 
    { 

    if (this->beamlets.at(beamletNumber).open) return false; 

    else if (!this->beamlets.at(beamletNumber).open) 
    { 
    this->beamlets.at(beamletNumber).setLeftRight(b1.left,b1.right); 
    this->beamlets.at(beamletNumber).isAssigned=true; 



    this->isSet=true; 
    return true; 
    } 
    } 

    else return false; 

} 

참고 한

경우 "this->는 isset = TRUE;" 행은 구조체의 수와 관계없이 오류가 명시되지 않는다는 점을 주석 처리합니다 : 예 6과 작동합니다! "isSet"부울 값은 어떤 객체가 설정되었는지를 결정하는 데 사용되며 이후 처리를 위해 데이터 파일에 기록해야하는 객체를 결정하는 데 사용됩니다.

시스템 및 sodtware :

GCC (SUSE 리눅스) 4.4.1 [GCC-4_4-지점 개정 150839] 수세 11.2 64 개 비트 인텔 섭씨 4 제온 2.66GHz의 CPU에 4GB의 RAM 이클립스 CDT와 (IDE) 64 비트 빌드 20100218-1602

+0

관찰 및 붙여 넣기 동작을 재현하는 최소 테스트 응용 프로그램을 작성하십시오. 하지만 가장 가능성있는 설명은 STL이 아니라 코드에 문제가 있다는 것입니다. – karlphillip

+0

다른 질문을 검토하고 답변을 수락하십시오. – karlphillip

답변

2

분명히 컨테이너 외부의 요소에 액세스하고 있습니다. 이 코드에서 인덱스가 올바른지 여부는 말할 것도 없으며 디버거에서이 코드를 살펴보면 알 수 있습니다. 의심스러운 조각 : this->beamlets.at(beamletNumber-1).isOpen() beamletNumber가 0 인 경우 어떻게됩니까? 색인이 잘못되었습니다.

+0

물론 이죠. 감사! 나무가 보이지 않는 경우! –

1

(에서 예외가 throw됩니다. 인덱스가 범위를 벗어나면 out_of_range 예외가 발생합니다.

(beamletNumber/beamletNumber-1)이 요소가있는 벡터의 색인에 해당하는지 확인합니다. at()은 그것을 검사하고 예외를 throw합니다.

out_of_range 클래스는 배열 값 컬렉션이나 문자열에 잘못된 인덱스가 사용 된 경우와 같이 인수 값이 예상되는 범위에 없다는 것을보고하는 데 사용됩니다.

2

제 생각에는 beamletNumber == 0을 전달하고 (부호없는) -1, 즉 매우 큰 숫자를 전달한 것 같습니다. (largenumber)에서

그런 다음 (beamletNumber) beamlets.at (beamletNumber-1) 및 this-> beamlets.at 모두 this->을 사용하는

0

가 발생합니다. 012lets (beamletNumber-1)은 this-> beamslets.at (beamletNumber)가 0 기반 색인을 제시하는 반면 벡터는 1 기반 색인으로 취급한다고 제안합니다.

1 기반 인덱스 this-> beamslets.at (beamletNumber)는 범위를 벗어난 오류를 발생시킵니다.

0- 기반 인덱스 this-> beamslets.at (beamletNumber-1)는 범위를 벗어난 오류를 확실히 나타냅니다.

관련 문제