많은 양의 데이터 배열을 메모리 (비) 할당을 관리하기 위해 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
관찰 및 붙여 넣기 동작을 재현하는 최소 테스트 응용 프로그램을 작성하십시오. 하지만 가장 가능성있는 설명은 STL이 아니라 코드에 문제가 있다는 것입니다. – karlphillip
다른 질문을 검토하고 답변을 수락하십시오. – karlphillip