2011-04-07 2 views
2

dynamic_cast에 문제가 있습니다. 난 그냥 내 프로젝트를 컴파일하고 디버그 모드에서 모든 것을 테스트 한 다음 해제 모드에서 컴파일 해봤지만 디버그 모드에서 모든 구성을 복사했습니다. 이제는/o2 인 exept 최적화 매개 변수 (디버깅 중에/od로 설정)가 이 프로젝트는 컴파일하지만 내 자원을로드 시작할 때 나는 여기에 코드 조각에 예외를 가지고 : 코드동적 캐스트 throws 포인터가 std가 아닙니다. :: __ non_rtti_object

for(int j = 1; j < i->second->getParametersNumber();j++) 
{ 
    CCTMXTiledMap* temp = CCTMXTiledMap::tiledMapWithTMXFile(i->second->As<string>(j).c_str()); 
    CCTMXLayer* ret = NULL; 
    for(NSMutableArray<CCNode*>::NSMutableArrayIterator l=temp->getChildren()->begin();!ret && l!=temp->getChildren()->end();l++) 
     ret = dynamic_cast<CCTMXLayer*> (*l); 
    t1.first = ret; 
    templates[i->first].second.push_back(t1); 
    templates[i->first].second.back().first->retain(); 
} 

아무것도 변경 내가 디버거에서 확인할 때 클래스의 모든 변수가 그것이 있어야 무엇하지만, 동적 캐스트가 던지고있다 std :: __ non_rtti_object. 내가 뭘 잘못 했니? 나는 cocos2d-x를 사용하고 있습니다. 태그를 추가할만한 충분한 평판이 없습니다!

+0

릴리스 구성에서 RTTI가 활성화되어 있습니까? 나는. 당신은 정말로 * 모든 것을 디버그 설정에서 복사 했습니까? – AnT

+0

예, 예. RTTI가 활성화되고 모든 것이 디버그 구성 – Ali1S232

+0

에서 복사됩니다.이 경우 잘못된 포인터 여야합니다. 디버그 빌드에서 잘못된 코드가 작동하고 릴리스 빌드에서 실패 할 수있는 수백만 가지 이유가 있습니다. – AnT

답변

1

이 경우 많은 코드를 변경 한 후에 코드가 최적화되었을 때 표시되는 버그가 있음을 알았습니다. (컴파일러의 최적화가 잘못되었거나 코드에 문제가 있지만 광산 일 가능성이 있습니다.) 그 문제의 주된 이유는 *l이 NULL 인 것이 었습니다.

1

CCNode에 가상 기능이 있습니까? temp-> getChildren() -> begin()의 모든 요소가 실제로 CCNode s입니까? temp->getChildren()는 참조를 반환합니까? 후자는 특히 교활합니다. temp->getChildren()->begin()temp->getChildren()->end()을 모두 호출합니다. getChildren()이 사본을 반환하면 사본 한 장의 사본은 begin이고 다른 복사본은 end입니다.

+0

많은 가상 기능을 가지고 있으며, 디버그 구성에서 디버깅 구성을 수행하는 동안 오류라고 말하면서 말합니다. – Ali1S232

관련 문제