RE:Release que no funciona.
Nuestro viejo amigo, el "comportamiento indefinido", ha alzado su fea cabeza una vez más.
No hay una razón en particular. Puede ser desde un puntero que apunte a basura en memoria hasta desbordamiento de cadenas de texto. Revisa tu código y asegúrate de que sigue el estándar (o si no lo sigue, asegúrate de que VC te permite hacer lo que sea que hiciste).
En particular, en una ocasión me sucedió algo similar. Tras horas de análisis, mucho café y dos cajetillas de cigarrillos me dí cuenta de que el problema recaía en una línea d código como la siguiente (la muestro muy simplificada, no soy tan wey como para pillar en algo así :P):
char sz[5];
strcpy(sz, _T("HOLA!"));
El problema es obvio, ¿no? La cadena la declaro para 4 caracteres más el nulo, y sin embargo le meto 5 caracteres (más el nulo, claro). En debug me funcionaba y en release lanzaba una excepción. Evidentemente esto es un comportamiento indefinido, por lo cuál no me puedo enojar con el compilador por su comportamiento ambiguo. Pero me entró la curiosidad, y me puse a investigar. Finalmente en uno de los artículos del Knowledge Base de MSDN me econtré con que el compilador hace lo siguiente: cada vez que se declara una variable, digamos de n bytes, estando en modo de debug EVC le agrega m bytes a la variable, donde m es el tamaño *que VC necesita para agregar información de depuración de la variable*. Entonces en debug, cuando me salía del búfer modificaba los bytes de la información de depuración. Cuando estaba en release, no había búfer de información de depuración y por ende, escribía en memoria inválida, provocando que EVC lanzara una excepción.
Así -como ves- eso del comportamiento indefinido suele ser un dolor de cabeza. Para tu búsqueda, te sugiero revises tus cadenas de texto, y más si trabajas con Unicode.
Saludos.