3 Stimmen

Dynamisches Gießen wirft Zeiger ist kein std::__non_rtti_object

Ich habe ein Problem mit dynamic_cast. Ich habe gerade mein Projekt kompiliert und alles im Debug-Modus getestet und dann versucht, es im Release-Modus zu kompilieren. Ich habe alle Konfigurationen vom Debug-Modus kopiert, außer dem Optimierungsparameter, der jetzt /o2 ist (während des Debuggens habe ich ihn als /od eingestellt). Das Projekt wurde kompiliert, aber als es begann, meine Ressourcen zu laden, bekam ich eine Ausnahme im folgenden Codeabschnitt:

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

Im Code hat sich nichts geändert und wenn ich im Debugger jede Variable in den Klassen überprüfe, ist sie das, was sie sein sollte. Aber das dynamic_cast wirft std::__non_rtti_object. Was mache ich falsch? Ich verwende cocos2d-x, ich hatte nicht genug Ruf, um dieses Tag hinzuzufügen!

1voto

MSalters Punkte 166675

Hat CCNode irgendwelche virtuellen Funktionen? Sind alle Elemente von temp-> getChildren()-> begin () wirklich CCNodes? Gibt temp->getChildren() eine Referenz zurück? Letzteres ist besonders heimtückisch: Sie rufen sowohl temp->getChildren()->begin() als auch temp->getChildren()->end() auf. Wenn getChildren() eine Kopie zurückgibt, nehmen Sie das begin einer Kopie und das end einer anderen Kopie.

1voto

Ali1S232 Punkte 3335

In diesem Fall habe ich nach vielen Code-Änderungen festgestellt, dass es einige Fehler geben muss, die sich zeigen, wenn der Code optimiert wird (ich weiß immer noch nicht, ob es sich um eine Fehloptimierung des Compilers handelt oder ob mein Code einige Probleme hat, aber es liegt wahrscheinlich an mir). Und der Hauptgrund für dieses Problem lag daran, dass *l NULL war.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X