2010-03-10 10 views
7

El siguiente código compilado en la configuración de depuración en VS2005 SP1 muestra dos mensajes con el aviso "ITERATOR LIST CORRUPTED".LISTA DE ITERADORES CORRUPTED en el constructor std :: string

Fragmento de código

#define _SECURE_SCL 0 
#define _HAS_ITERATOR_DEBUGGING 0 

#include <sstream> 
#include <string> 

int main() 
{ 
    std::stringstream stream; 
    stream << "123" << std::endl; 
    std::string str = stream.str(); 
    std::string::const_iterator itFirst = str.begin(); 
    int position = str.find('2'); 
    std::string::const_iterator itSecond = itFirst + position; 
    std::string tempStr(itFirst,itSecond); ///< errors are here 
    return 0; 
} 

¿Es un error en el compilador o biblioteca estándar?

+0

Me sucede en VS2008 también. Fascinante. – avakar

+0

Considere utilizar codepad.org para realizar pruebas contra gcc rápidamente: http://codepad.org/mXXYxf99 esto es definitivamente un error de Windows/Visual Studio. por favor repórtalo. –

Respuesta

2

Lo que @dirkgently dijo en su edición.

Aparentemente, un código para std::string se encuentra en el dll de tiempo de ejecución, en particular, la definición de macro no tiene efecto para el constructor y se ejecuta el código para la depuración del iterador. Puede solucionar esto al vincular estáticamente la biblioteca de tiempo de ejecución.

Lo consideraría un error, aunque tal vez no en el propio Visual Studio, sino en la documentación.

+0

Gracias. La vinculación estática resuelve el problema. –

3

¡Malo! Editar: Sí, problema con el compilador. Ver this - particularmente la sección Contenido de la comunidad.

+0

¿Qué quieres decir? 'std :: string' tiene iteradores de acceso aleatorio. – avakar

+0

¿por qué se puede compilar el código? – Vlad

0

Hay un problema con el código. Así, varios de hecho:

  1. std.find('2') devuelve un size_t, usted tiene un problema potencial fundido si el valor de la size_t devuelto (como std::string::npos) es superior a lo que un int puede sostener (que acabaría con un negativo int creo ...)
  2. position si es negativo o igual a std::string::npos entonces el rango itFirst,itSecond está mal definida (ya sea porque es itSecond antes itFirst o porque es pasado str.end())

Corrija su código y verifique si aún se descarta. La depuración del iterador está aquí para ayudarlo a detectar estos errores, inhabilitándolo y actuando como un avestruz.

+1

La versión de cadena de find() en realidad devuelve un std :: string :: size_type. –

+0

Generalmente tiene razón, pero en este caso específico '_HAS_ITERATOR_DEBUGGING' está desactivado. Si establece '_HAS_ITERATOR_DEBUGGING' en 1, no habrá errores. Por lo tanto, parece ser un error en CRT. – Paul

+0

@Neil: cierto, y la mayoría de los contenedores utilizan efectivamente un typedef interno 'size_type' para todos los fines de la indexación, que nunca he visto que no sea' size_t' en las (pocas) implementaciones de la STL que he encontrado. El problema real es que con mucha frecuencia no es un valor sin signo (ya que la indexación en negativo no tiene sentido, a menos que esté utilizando Sweet Python). –

Cuestiones relacionadas