Encontré un problema al ejecutar algún código anterior que me fue transmitido. Funciona el 99% del tiempo, pero de vez en cuando, noto que arroja una excepción de "Violación de ubicación de lectura". Tengo un número variable de subprocesos que pueden ejecutar este código durante la vida del proceso. La baja frecuencia de aparición puede ser indicativa de una condición de carrera, pero no sé por qué se causaría una excepción en este caso. Aquí está el código en cuestión:Localización de lectura de violación en el operador de std :: map []
MyClass::Dostuff()
{
static map<char, int> mappedChars;
if (mappedChars.empty())
{
for (char c = '0'; c <= '9'; ++c)
{
mappedChars[c] = c - '0';
}
}
// More code here, but mappedChars in not changed.
}
La excepción en la aplicación del operador [] del mapa, en la primera llamada al operador [] (Uso de la aplicación VS2005 de STL.)
mapped_type& operator[](const key_type& _Keyval)
{
iterator _Where = this->lower_bound(_Keyval); //exception thrown on the first line
// More code here
}
Ya probé la congelación de subprocesos en el operador [] y trato de que todos se ejecutaran al mismo tiempo, pero no pude reproducir la excepción con esa metodología.
¿Puedes pensar en alguna razón por la que eso arrojaría, y solo algunas veces?
(Sí, ya sé STL no es seguro para subprocesos y necesitaré para hacer cambios aquí. Estoy sobre todo curiosidad de por qué estoy viendo el comportamiento que he descrito anteriormente.)
Conforme a lo solicitado, aquí algunos detalles adicionales sobre la excepción:
Excepción no controlada en 0x00639a1c (app.exe) en app15-51-02-0944_2008-10-23.mdmp: 0xC0000005: Acceso a la ubicación de lectura de la infracción 0x00000004.
Gracias a todos por sugerir soluciones a problemas de subprocesamiento múltiple, pero esto no es lo que esta pregunta debe abordar. Sí, entiendo que el código presentado no está protegido correctamente y es excesivo en lo que está tratando de lograr. Ya tengo la solución implementada. Solo estoy tratando de comprender mejor por qué se lanzó esta excepción, para empezar.
Conocer la dirección de la violación podría ser útil. Es posible que "esto" sea nulo y no tenga nada que ver con el mapa en sí. –