2011-01-16 8 views
0

싱글 톤, 즉 이미지 관리자입니다.std :: map을 초기화해야합니까?

m_imageMap[imageHashID].setHeight(ilGetInteger(IL_IMAGE_HEIGHT)); 
m_imageMap[imageHashID].setWitdh(ilGetInteger(IL_IMAGE_WIDTH)); 
m_imageMap[imageHashID].setBpp(ilGetInteger(IL_IMAGE_BPP)); 
.... 

문제는 내가를 얻을 수 있습니다 : loadFromFile 방법으로, 나는지도에 이미지를 저장,

utils::CImageBuff* img4 = utils::CImageManager::getInstance()->loadFromFile("uswg.png"); 

그리고 : 나는 이미지를로드 할 때, 나는 이런 식으로 싱글을 호출 mem 액세스 오류. m_imageMap이 NULL 인 경우와 같습니다. o 잘못된 문장이 첫 번째 문장에서 throw되기 때문에 잘못 초기화되었습니다. 하지만 내가 말했듯이 싱글 톤이므로지도를 초기화해야합니다. VC++ 2008에서 개발 중입니다. 잘못된 컴파일/.obj 파일 일 수 있습니까?

어제도 잘 작동했습니다.

몇 가지 조언이 있습니까?

편집 : m_imageMap의 선언은 매우 간단 :

typedef std::map<unsigned int,utils::CImageBuff> t_imageMap; 

같은 추가 정보를 생성하는 예외 파일 output.c의 행 1643로이다.

편집 글쎄, 나는이 사건에 매우 실망했다. 코드를 변경하여 클래스가 더 이상 싱글 톤이 아니게되었습니다. 이제 m_imageMap 만 정적이므로 모든로드 된 이미지를 어느 위치에서나 볼 수 있습니다. 그러나 여전히 같은 방식으로 실패합니다. 오류는 액세스 위반입니다. 또한,이 코드로 모든 메소드 코드를 다음과 같이 변경하면 :

utils::CImageBuff im; 
m_imageMap[1] = im; // fails here 
return &im; 

여전히 실패합니다. 지도가 null이거나 어떤 방식 으로든 고정되어 있거나 심지어 초기화 상태가 좋지 않은 것처럼 보입니다. 그러나 모르겠습니다. 당신이 나를 도울 수?

코드가 더 필요하면 붙이 겠지만이 세 줄을 사용하면 문제가 간단 해집니다.

편집 : 마지막으로 마지막으로 내가

std::map<unsigned int,utils::CImageBuff*> 

std::map<unsigned int,utils::CImageBuff> 

에서 변경 한 해결 그리고 지금은 작동합니다. 이제 포인터의 정적 std :: map의 내용을 삭제하는 메서드를 생각하면됩니다. 모든

+0

어떻게'm_imageMap'이 선언 되었습니까? –

+3

'm_imageMap'의 정의를 보여주세요. 'std :: map'은'NULL' 일 수 없습니다. 그건 말이되지 않습니다. –

+1

m_imageMap은 어떤 유형입니까? 나머지 loadFromFile 함수는 어떻게 생겼습니까? – SoapBox

답변

3

나는 m_imageMap이 클래스의 일반 멤버 변수이고이 클래스의 멤버 함수에서 이것을 호출한다고 가정합니다.

이 경우 좀비에서 해당 멤버 함수를 호출 할 가능성이 높습니다. 그렇지 않으면 유효하지 않은 포인터가 null입니다.해당 함수에서 멤버 변수의 첫 번째 사용에 m_imageMap을 사용하는 코드 줄이 있습니까? 그건 꽤 일반적인 공짜입니다.

이 문제를 디버깅하는 쉬운 방법은 디버거에서 보는 것입니다. 이 오류가 디버그 빌드에서 발생하는 한, VC++는 행복하게 액세스 위반 예외를 잡아 즉시 그 순간에 깨뜨릴 것입니다. 지역 변수 조사 창에서 "this"포인터의 값을보십시오. null 또는 0xcdcdcdcd입니까?

+0

나는 당신의 응답을 완전히 받아들이지 않습니다. 실제로 m_imageMap은 클래스의 일반 멤버이며이 클래스의 멤버 함수에서이 멤버를 호출합니다. 그러나 문제는이 좀비를 잡는 방법과 싱글 톤이되는 방법,이 좀비를 자극하는 코드를 찾는 방법입니다. m_imageMap가 정확하게 null가 아닙니다. 그 값은 간단하게 (디버그 모드의 검사에 따라) [0]()이지만 언제든지 변경되지 않습니다. AFAIK, 당신은 단순히이 요소를 구성하는 요소를 삽입해야합니다 .... – Killrazor

+0

내가 말하려고하는 것은 m_imageMap 자체에는 아무런 문제가 없다는 것입니다 (비록 싱글 톤에서 CImageBuff의 포인터를 얻는 것이 이상하지만 로더가 아니라 원본에 대한 포인터가 아닌 맵에 CImageBuff의 복사본을 저장하면 문제가있을 수 있습니다.) 대신 문제는 m_imageMap을 소유하는 클래스에서 발생합니다. 어떻게 그것을 만들고 그것을 참조합니까? ImageMapOwnerClass * owner = null; owner-> AddSomethingToImageMap();', 당신이 묘사하는 것처럼 정확히 충돌 할 것입니다 (예제 코드가 해당 함수에있는 경우). – Alan

2

표준 : 맵에

많은 감사 적절한 생성자가 제공하는 것 이외의 initialization- 필요로하지 않습니다. 생성자를 호출하면 (기본 설정도 괜찮습니다)지도가 제대로 초기화됩니다. 싱글 톤은 많은 끔찍한 문제가있는 참으로 끔찍한 패턴이며 코드에서 그런 악마를 제거해야합니다. 실제로 발생하는 문제에 대한 도움을 얻으려면 싱글 톤 코드와 함께 다른 질문을 게시해야합니다.

+0

싱글 톤은 끔찍한 디자인 패턴입니다. –

관련 문제