2017-12-24 20 views
0

벡터가 SFML 클래스 (sf::Drawable)의 shared_ptr으로 채워져 있습니다. 이제 새로운 shared_ptrsf::Drawable으로 가져와 벡터에 추가하는 기능이 있습니다. 벡터 선언 (가 GUINodeBody라는 이름의 클래스 내에, 이름으로 혼동되지 않음) : 이제C++ 벡터 _mylast가 0xC를 반환했습니다

std::vector<std::shared_ptr<sf::Drawable>>* allTestWidgets; 

, 기능 :

void GUINodeBody::addWidget(std::shared_ptr<sf::Drawable> widget) { 
    allTestWidgets->push_back(widget); 
} 

하지만이 함수를 호출, 비주얼 스튜디오 예외가 던져 질 수있는 이유

Reading acess violation 
std::_Vector_alloc<std::_Vec_base_types< 
    std::shared_ptr<sf::Drawable>, 
    std::allocator<std::shared_ptr<sf::Drawable> > 
> >::_Mylast**(...) returned 0xC. 

아무도 알고 있나요 : vector에서 예외 라인 1731을 던져?

+4

쉽게 그. 코드의 어딘가에 버그가 있기 때문에 예외가 발생합니다. 버그는 어디에서나 발생할 수 있습니다. 프로그램이이 줄에서 충돌하기 만해도 버그가있는 곳이 아닙니다. 예를 들어, 유효하지 않은 포인터에 쓰기가 성공하지만 메모리가 손상됩니다. 이 프로그램은 손상된 메모리를 사용하려고 시도 할 때까지 계속 실행되며 충돌합니다. 버그가 코드에서 어디에 있는지 파악하고 수정해야합니다. [mcve]의 모든 요구 사항을 충족하는 예를 제시 할 수있는 경우 [도움말]에서 설명한대로 질문을 편집하고 포함 할 수 있습니다. –

+4

화재가 발생하기 전에 연기에 대처하는 방법 :'allTestWidgets'가 왜 포인터입니까? – Quentin

+0

@Quentin 다른 클래스로 옮겨 다니는 것이 더 편리 할 것이라고 생각 했으므로 – Ben

답변

0

낮은 주소 오류가있는 VS에 액세스 할 수 없으므로 allTestWidgetsnullptr입니다.

쉽게 다음 코드로 증명 :

#include <vector> 
std::vector<int>* allTestWidgets; 

void addWidget(int widget) 
{ 
    allTestWidgets->push_back(widget); 
} 

int main() 
{ 
// allTestWidgets = new std::vector<int>; This is the fix line 
    addWidget(42); 
    delete allTestWidgets; 
} 
+0

이것은 공평한 추측이지만 여전히 추측 할 수 있습니다. 가비지/null ptr을 'GUINodeBody'또는 우리가 볼 수없는 다른 임의의 버그를 읽음으로써 쉽게 쉽게 얻을 수 있습니다. 또한 "수정"은 더 많은 문제가있는 op를 남겨 둘 것입니다. – George

+0

이것은 사실이며'GUINodeBody' (익숙하지 않은)를 읽는 것은'std :: vector'-class를 사용하는 동안 평가해야합니다. 하지만 다른 임의의 버그는 물론 제외 할 수 없습니다. –

+0

죄송합니다. 죄송합니다. 벡터를 초기화하는 것을 잊어 버렸습니다. 감사! (지금 작동) – Ben