Surviving the Release Version le da una buena visión general.
cosas que he encontrado - la mayoría ya se mencionan
inicialización de variables con mucho el más común. En Visual Studio, las compilaciones de depuración inicializan explícitamente la memoria asignada a los valores dados, ver p. Memory Values aquí. Estos valores generalmente son fáciles de detectar, causan un error fuera de límites cuando se usan como índice o una infracción de acceso cuando se usan como punteros. Un booleano no inicializado es cierto, sin embargo, y puede causar errores de memoria no inicializados que pasan desapercibidos durante años.
En las versiones de lanzamiento donde la memoria no se ha inicializado explícitamente que sólo mantiene el contenido que tenía antes. Esto conduce a bloqueos "aleatorios" y "valores divertidos", pero a menudo a bloqueos determinísticos que requieren que se ejecute un comando aparentemente no relacionado antes del comando que realmente falla. Esto se debe a que el primer comando "configura" la ubicación de la memoria con valores específicos, y cuando las ubicaciones de memoria se reciclan, el segundo comando las ve como inicializaciones. Eso es más común con las variables de pila no inicializadas que con Heap, pero también me ha pasado a mí.
La inicialización de la memoria bruta también puede ser diferente en una compilación de lanzamiento, ya sea que se inicie desde el estudio visual (depurador conectado) o desde el explorador. Eso hace que los errores de compilación de versión "más bonitos" que nunca aparecen bajo el depurador.
Optimizaciones válidas vienen en segundo lugar en mi exeperiencia. El estándar C++ permite que ocurran muchas optimizaciones que pueden ser sorprendentes, pero que son completamente válidas, p. cuando dos punteros alias la misma ubicación de memoria, no se considera el orden de inicialización o múltiples subprocesos modifican las mismas ubicaciones de memoria, y se espera un cierto orden en el que el subproceso B ve los cambios realizados por el subproceso A. A menudo, se culpa al compilador estas. ¡No tan rápido, joven yedi! - véase más adelante
sincronización versión se basa no sólo hacer "correr más rápido", para una variedad de razones (optimizaciones, registrando las funciones que proporcionan un punto de sincronización hilo, código de depuración similares no ejecutado según afirma etc.) También el tiempo relativo entre las operaciones cambian dramáticamente. El problema más común descubierto por eso son las condiciones de carrera, pero también los bloqueos y la simple ejecución de "orden diferente" de código de mensaje/temporizador/evento. A pesar de que son problemas de sincronización, pueden ser pueden ser sorprendentemente estables en las construcciones y plataformas, con reproducciones que "funcionan siempre, excepto en PC 23".
Guard Bytes. Las compilaciones de depuración a menudo ponen (más) bytes de protección alrededor de instancias y asignaciones seleccionadas, para proteger contra desbordamientos de índices y, a veces, subdesbordamientos. En los casos poco frecuentes en los que el código se basa en desplazamientos o tamaños, p. serializar estructuras crudas, son diferentes.
Otras diferencias de código Algunas instrucciones - e.g afirma: no evalúa nada en las versiones de lanzamiento. A veces tienen diferentes efectos secundarios. Esto es frecuente con engaños macro, como en el clásico (advertencia: múltiples errores)
#ifdef DEBUG
#define Log(x) cout << #x << x << "\n";
#else
#define Log(x)
#endif
if (foo)
Log(x)
if (bar)
Run();
Lo cual, en una versión de lanzamiento, se evalúa como si (foo & & bar) Este tipo de error es muy, muy raro con el código C/C++ normal y macros que están escritos correctamente.
Errores del compilador Esto realmente nunca sucede. Bueno, lo hace, pero es mejor para la mayor parte de su carrera asumir que no es así. En una década de trabajo con VC6, encontré uno en el que todavía estoy convencido de que este es un error de compilación no fijo, en comparación con decenas de patrones (tal vez incluso cientos de instancias) con una comprensión insuficiente de las Escrituras (por ejemplo, el estándar).
Mientras traté de responder a su pregunta, tal vez eso no ayude a resolver el problema. Primero, consigue una buena reproducción. En segundo lugar, habilite la información de depuración en la versión de lanzamiento. Crash todavía allí? no -> puede ser temporización o inicialización. Sí -> use el depurador (remoto) – peterchen