Visuele C++-zoekregel die “Debug Assertion failed” veroorzaakt

Ik probeer een C++-programma te krijgen dat prima werkt wanneer het is gecompileerd met gcc om correct te werken op Visual C++. Mijn probleem is dat ik nu de volgende foutmelding krijg:

Debug Assertion Failed!
Program: C:\WINDOWS\SYSTEM32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector
Line: 1140
Expression: vector subscript out of range

Mijn echte probleem is dat ik niet weet wanneer of waar dit gebeurt. Door in het foutvenster op break te drukken, word ik alleen naar het deel van de vectorklasse gebracht waar de uitzondering uiteindelijk plaatsvond. Ik wil de plaats in mijn applicatie vinden die het daadwerkelijk heeft veroorzaakt. Ik heb het kunnen beperken tot dit codeblok:

   for(unsigned int i=0;i<openPolygonList.size();i++)//error somewhere in here
    {
        if (openPolygonList[i].size() < 1) continue;
        for(unsigned int j=0;j<openPolygonList.size();j++)
        {
            if (openPolygonList[j].size() < 1) continue;
            Point diff = openPolygonList[i][openPolygonList[i].size()-1] - openPolygonList[j][0];
            int64_t distSquared = vSize2(diff);
            if (distSquared < 2 * 2)
            {
                if (i == j)
                {
                    polygonList.push_back(openPolygonList[i]);
                    openPolygonList.erase(openPolygonList.begin() + i);
                }else{
                    for(unsigned int n=0; n<openPolygonList[j].size(); n++)
                        openPolygonList[i].push_back(openPolygonList[j][n]);
                    openPolygonList[j].clear();
                }
            }
        }
    }

Gewoon breekpunten plaatsen op elke regel waar een vector wordt gebruikt, is geen optie, omdat de lus duizenden keren wordt herhaald en elke keer op doorgaan moet drukken, kost me letterlijk uren. Is er een manier waarop ik de debugger kan vertellen om op de juiste regel te remmen zodra de fout optreedt. Het kan me helpen om de variabelen te inspecteren en te bepalen welke variabele buiten bereik is?


Antwoord 1, autoriteit 100%

Ik denk dat het probleem is dat je leden wist van de vector waar je doorheen itereert. Wat gebeurt er als je het eerste element wist?

ik 1 2 3
Ei v1 v2 v3

Als we 1 wissen wanneer i = 1, zijn onze vectorindices en waarden lager en nu i = 2.

ik 1 2
Ei v2 v3

Uiteindelijk denk ik dat je voorbij het einde van de vector kunt itereren, waardoor je een aanwijzer hebt die voorbij het einde van de vector wijst. Compleet giswerk hier, maar er is waarschijnlijk een gemakkelijkere manier om te doen wat je probeert te doen. Ik snap gewoon niet wat je probeert te doen.

Het lijkt erop dat u de rijen en kolommen van een tweedimensionale array probeert om te keren terwijl u de diagonale polygonen in de array opslaat in een nieuwe array. Hoe dan ook, ja, maar een rode cirkel aan het begin van de for-lus en loop regel voor regel door je code.

Ik zou tijdelijke vectoren maken en die vervolgens aanpassen in de for-lus en dan de vector openPolygonList vervangen.


Antwoord 2, autoriteit 100%

De debugger kan de toekomst niet voorspellen, maar je kunt hem vertellen om alleuitzonderingen te doorbreken (ctrl+atl+e en vink alle vakjes aan onder “Gegooid”). Wanneer de assert gebeurt, loop je door de call-stack naar je code, het zal je vertellen welke regel het probleem veroorzaakt.


Antwoord 3, autoriteit 60%

U kunt het call-stackvenster (Debug->windows->CallStack) openen en de plek in uw programma vinden die tot de bewering heeft geleid.
Het moet 2 of 3 regels onder de bovenste regel staan.

Other episodes