invalid operator<
-
Folgender Test-Code:
bool sortVisiblePatchesFrontToBack(const IndexIntervalDesc& lhs, const IndexIntervalDesc& rhs) { return true; } void TQT::computeVisiblePatches(const ICamera& cam, std::vector<IndexIntervalDesc>& patches) { for(int i=0; i < 4; i++) tier1Quadrants[i]->traverse(cam, patches); std::sort(patches.begin(), patches.end(), sortVisiblePatchesFrontToBack); // Hier fliegt die assertion }Liefert mir beim std::sort eine Debug Assertion Failed! Expression: invalid operator<
Was ist da der Fehler im Code?
-
Du benötigst ein strict weak ordering criterion (eindeutiges Sortierkriterium), was in deiner Funktion nicht gegeben ist.
-
Hm, aber woher weiß denn der Compiler, dass meine Funktion nur eine Dummy-Funktion ist? Syntaktisch ist mein Prädikat ja richtig.
-
Der Compiler weiss es gar nicht, der Fehler tritt ja zur Laufzeit im Debugger auf.
In
std::sortscheint es eine Assertion zu geben, die überprüft, ob eine Sortierung nach jenem Kriterium überhaupt möglich ist.
-
Sortiera schrieb:
Folgender Test-Code:
bool sortVisiblePatchesFrontToBack(const IndexIntervalDesc& lhs, const IndexIntervalDesc& rhs) { return true; } void TQT::computeVisiblePatches(const ICamera& cam, std::vector<IndexIntervalDesc>& patches) { for(int i=0; i < 4; i++) tier1Quadrants[i]->traverse(cam, patches); std::sort(patches.begin(), patches.end(), sortVisiblePatchesFrontToBack); // Hier fliegt die assertion }Liefert mir beim std::sort eine Debug Assertion Failed! Expression: invalid operator<
Was ist da der Fehler im Code?
Du bekommst ja auch eine Laufzeitassertion und keinen Kompilerzeitfehler.
-
Also, ich habe jetzt mein Prädikat ausgeschrieben:
bool sortVisiblePatchesFrontToBack(const IndexIntervalDesc& lhs, const IndexIntervalDesc& rhs) { return lhs.distanceToCamSq < rhs.distanceToCamSq; }An computeVisiblePatches hat sich nichts geändert. Wenn ich das ganze jetzt im Debug Modus laufen lasse, gibts keine Probleme. Wenn ichs jedoch im Release Modus starte, bekomme ich eine "Uhandled exception":
Unhandled exception at 0x7779f217 in OR.exe: 0xC0000005: Access violation reading location 0xc679ffff.
Ich habe im Call Stack nachgeschaut und die letzten paar Zeilen lauten:
OR.exe!free(void * pBlock=0xc67a0000) Line 110 C
OR.exe!std::_Destroy_range<IndexIntervalDesc,std::allocator<IndexIntervalDesc> >(IndexIntervalDesc * _First=0x0759df98, IndexIntervalDesc * _Last=0x0759dfc4, std::allocator<IndexIntervalDesc> & _Al={...}, std::_Nonscalar_ptr_iterator_tag __formal={...}) Line 235 + 0xf bytes C++
OR.exe!std::vector<IndexIntervalDesc,std::allocator<IndexIntervalDesc> >::_Insert_n(std::_Vector_iterator<IndexIntervalDesc,std::allocator<IndexIntervalDesc> > _Where={nodeID=<Bad Ptr> distanceToCamSq=1.9114282e+036 indexCount=470909263 ...}, unsigned int _Count=1, const IndexIntervalDesc & _Val={...}) Line 1156 C++
Weiß irgendwer was das bedeutet und wieso es ihn im Relase Modus zerlegt?
