Visual C++ find line causing "Debug Assertion failed"

estou a tentar obter um programa C++ que funcione bem quando compilado com o gcc para funcionar correctamente em C++Visual. Meu problema é que agora estou recebendo o seguinte erro:

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
O meu verdadeiro problema é que não sei quando ou onde isto acontece. Ao pressionar break in the error window eu sou levado meramente para a parte da classe vector onde a exceção finalmente aconteceu. Quero encontrar o lugar na minha candidatura que realmente causou isso. Consegui reduzi-lo a isto. bloco de código:

    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();
                }
            }
        }
    }

simplesmente colocar brealpoints em cada linha onde um vetor é usado não é uma opção porque o loop itera milhares de vezes e ter que pressionar continuar cada vez vai literalmente levar-me horas. Existe alguma maneira que eu possa dizer ao depurador para travar na linha apropriada uma vez que o erro ocorre para que eu possa inspecionar as variáveis e determinar qual está fora de alcance?

Author: Gerharddc, 2013-06-24

3 answers

Acho que o problema é que estás a apagar os membros do vector que estás a atravessar. O que acontece se apagar o primeiro elemento?

I 1 2 3 Ei v1 v2 v3

Se apagarmos 1 quando i = 1, os nossos índices e valores vetoriais estão abaixo e agora i = 2.

Ei v2 v3

Em última análise, acho que se pode iterar para além do fim do vector, fazendo com que se tenha um ponteiro que aponta para além do fim do vector. Trabalho de adivinhação completo aqui, mas há provavelmente é uma maneira mais fácil de fazer o que estás a tentar fazer. Não consigo perceber o que estás a tentar fazer.

Parece que estás a tentar inverter as linhas e colunas de um array bidimensional enquanto armazenas os polígonos diagonais num novo array. De qualquer forma, Sim, mas um círculo vermelho no início do loop for e andar através do seu código linha por linha. Eu criaria vetores temporários e depois modificaria aqueles no laço for e depois substituiria o vector. openPolygonList.
 3
Author: Chemistpp, 2013-06-24 15:43:19

O depurador não consegue prever o futuro, mas pode dizer-lhe para quebrar em todas as excepções, (ctrl+atl+e e assinalar todas as caixas em "atirado"). Quando o assert acontecer, caminhe pela pilha de chamadas para o seu código ele irá dizer - lhe qual linha está causando o problema.

 3
Author: doctorlove, 2013-06-24 15:38:51

Você pode abrir a janela da pilha de chamadas (depurar->windows->CallStack) e encontrar o local no seu programa que levou à afirmação. Deve estar 2 ou 3 linhas abaixo da linha superior.

 2
Author: kovarex, 2013-06-24 20:05:05