2012-09-30 5 views
4

이 기능은 완벽하게 잘 작동 정도 컴파일러/디버거 나에게 여기에서이 코드로 인해 액세스 위반이 발생하는 이유는 무엇입니까?

void GUIManager::init(ToScreen* tS) 
{ 
    toScreen = tS; 
    loadFonts(); 
    GUI_Surface = SDL_SetVideoMode(toScreen->width, toScreen->height, 32, SDL_SWSURFACE); 
    components.push_back(&PlainText("Hello, World!", font, -20, -40)); 

} 

를 알려줍니다, 첫 번째 함수 호출 액세스 위반 오류가 발생합니다. 디버거에 문제가 표시되지 않습니다. 프로그램이 여기서 중단되므로 구성 요소 [0]을 디버깅 할 수있는 기회가 없습니다. 이 필요한 경우

void GUIManager::draw() 
{ 
    // This line here is the problem 
    components[0].draw(GUI_Surface); 
    // This line here is the problem 


    SDL_BlitSurface(GUI_Surface, NULL, toScreen->Screen_Surface, NULL); 
} 

, 이것은 내 '구성 요소'

boost::ptr_vector<GUIComponent> components; 

그냥 다른 코드가 필요한 경우 알려 주시기 바랍니다. components만큼 존재합니다 당신은 동적 객체를 밀어해야

components.push_back(&PlainText("Hello, World!", font, -20, -40)); 

: 대신 그냥이 줄 끝의 수명을 종료 일시적으로 포인터를 밀어 아마도 그 평문 또는 GUIComponent

+1

그냥 다 '구성 요소'의 요소 수가 드워싱 전에 0이 아닙니다. –

+0

구성 요소 [0]. 위치 .x + = 1; 괜찮아요. – Kelpsie

+0

로컬 변수의 주소를 구성 요소로 푸시합니다. 이 메모리가 해제되면 나중에 액세스 할 때 액세스 위반이 발생할 수 있습니다. – combinatorial

답변

6

components.push_back(new PlainText("Hello, World!", font, -20, -40)); 

참조 문서 : http://www.boost.org/doc/libs/1_51_0/libs/ptr_container/doc/ptr_sequence_adapter.html#modifiers

void push_back(T* x); 
    Requirements: x != 0 
    Effects: Inserts the pointer into container and takes ownership of it 
    Throws: bad_pointer if x == 0 
    Exception safety: Strong guarantee 
+0

'boost :: ptr_vector'는'std :: vector'와는 달리 나중에 객체의 삭제를 관리한다는 점은 주목할 가치가 있습니다. – user1201210

+0

@Dynguss 사실 추가 된 전체 문서. – PiotrNycz

+0

크게 감사드립니다. 문제를 성공적으로 해결했습니다. 또한 필자는 그 문서를 확실히 살펴볼 것입니다. – Kelpsie

관련 문제