¿Por qué está afirmando mi código vectorial? ¿Qué es una afirmación de todos modos?

StackOverflow https://stackoverflow.com/questions/817429

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Qué es exactamente un & "; afirmar &"; o más específicamente, ¿cómo puedo deshacerme de un error? Cuando creo un vector de punteros a una clase con el miembro de datos int x, y luego hago esto:

for(I=antiviral_data.begin();I<antiviral_data.end();I++)
{
    if((*I)->x>maxx)
    {
        antiviral_data.erase(I);
    }
}

Y ejecuto el programa, no obtengo errores hasta que x es mayor que maxx y uso .erase (), en cuyo punto obtengo este error:

  

¡Error en la aserción de depuración!

     

Programa: ... Mis documentos \ O.exe Archivo:   ... incluye \ vector Line: 116

     

Expresión:   (" this - > _Tiene_container () ", 0)

     

Para obtener información sobre cómo funciona su programa   puede causar una falla de aserción, ver   la documentación de Visual C ++ en   afirma.

     

(Presione Reintentar para depurar la aplicación)

     

[Abortar] [Reintentar] [Ignorar]

Además, si intento usar cout:

cout<<(*antiviral_data.begin())->x<<endl;

Me sale este error:

  

¡Error en la aserción de depuración!

     

Programa: ... Mis documentos \ O.exe Archivo:   ... incluye \ vector Line: 98

     

Expresión: el iterador de vector no   deferencable

     

Para obtener información sobre cómo funciona su programa   puede causar una falla de aserción, ver   la documentación de Visual C ++ en   afirma.

     

(Presione Reintentar para depurar la aplicación)

     

[Abortar] [Reintentar] [Ignorar]

¿Podría alguien decirme por qué no puedo USAR ninguno de los datos del vector y cómo solucionarlo?

TAMBIÉN: antiviral_data es un vector de punteros, con un solo elemento:

antiviral_data.push_back(new aX1(player.x,player.y,'>'));

Si eso ayuda.

¿Fue útil?

Solución

La razón más probable por la que obtienes la afirmación es que incrementas I después de un borrado. Intente esto en su lugar:

for(I=antiviral_data.begin();I!=antiviral_data.end();)
{
    if((*I)->x>maxx) I=antiviral_data.erase(I); else ++I;
}

Consulte también http://www.cppreference.com/wiki/stl/vector/ borrar , busque iteradores inválidos en esa página.

Otros consejos

Una afirmación es típicamente una expresión ingresada por un desarrollador para propósitos de control de errores y depuración: usted pone " controles de cordura " en su código y haga que bloquee el programa si no se alcanza la verificación.

Por ejemplo, imagine que tenía un código que iba a dividir dos números en algún lugar del camino. A pesar de que siempre espera una división por un valor distinto de cero, lo afirma antes de la división en caso de que un argumento se haya calculado mal. Si la afirmación falla, significa que en algún lugar del camino hubo una falla.

Las aserciones generalmente aparecen solo en la versión de depuración en el código (si usa Visual C ++ puede compilar para depurar y liberar). Si bien la compilación en modo de lanzamiento eliminaría los resultados, es una muy mala idea, ya que todavía tendría un error y probablemente resultados realmente malos.

En algún lugar de la implementación de Vector (es estándar), y específicamente en la línea 98, hay una afirmación. Si tiene acceso al código vectorial, mire para ver cuál es la afirmación o depure hasta ese punto. Esto podría indicar un error en la implementación del vector o en el código que llama al vector.

Lo que publicaste nos da algunas pistas de lo que está sucediendo, pero sería útil si pudieras pegar más del programa, incluso dónde están definidos los vectores.

El problema es con borrar llamada. Está iterando a través de un contenedor y al mismo tiempo borrando elementos de él. Después de borrar, su iterador se vuelve inválido. Si desea eliminar elementos de un valor particular de un vector, utilice borrar con el algoritmo remove_if. Esto se conoce como un lenguaje de eliminación de borrado y se explica muy bien en el libro Effective STL de Scott Meyer. También puede consultar esta pregunta Borrar elementos de un vector para obtener más información.

Ya tiene un par de buenas respuestas sobre qué es una afirmación y por qué se activa en su código. Ahora, es posible que desee considerar el uso de algoritmos STL para una eliminación de dos pasos.

namespace {
   struct exceeds : public std::unary_function< TheUnknownType*, bool >
   {
      exceeds_max( int max ) : maxx( max ) {}
      bool operator()( TheUnknownType* data ) {
         return data->x < max;
      } 
   private:
      int maxx;
   };
}
void your_function()
{
   std::vector< TheUnknownType* >::iterator new_end;
   new_end = std::remove_if( antiviral_data.begin(), antiviral_data.end(), exceeds(maxx) );
   antiviral_data.remove( new_end, antiviral_data.end() );
}

La principal ventaja es que borrar elementos en un vector es una operación costosa. Para cada elemento borrado, todos los elementos desde esa posición hasta el final del vector deben moverse una posición hacia el principio. El segundo elemento que borre forzará un segundo movimiento de todos los elementos a partir de ahí ... El algoritmo STL remove_if realiza los movimientos solo una vez a su posición final, devolviendo un iterador un pasado el último elemento no eliminado elemento. Luego puede realizar un solo std :: vector & Lt; & Gt; :: remove que no necesitará reubicar elementos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top