2012-05-10 16 views
6

estoy usando VS 2010.
Cuando ejecuto este programa en el modo de depuración se lanza excepción de desbordamiento de pila y muestra una línea de ruptura en el chkstk.asm archivo en la línea 99. Pero
cuando lo ejecuto en el modo Release, está bien.
Además, si disminuyo el tamaño de una de las matrices a 10000, funciona bien en Debug. ¿Cual es la razon?excepción de desbordamiento de pila en el programa tonta

#include <iostream> 

using namespace std; 
int main() 
{ 
    char w[1000001], temp[1000001]; 
    cout<<"Why?"<<endl; 
    return 0; 
} 
+3

¿Qué optimizaciones ha habilitado en el modo de lanzamiento? Hay una buena posibilidad de que el compilador simplemente esté eliminando las matrices. –

+0

posible duplicado de [Desbordamiento de pila al depurar pero no en versión] (http://stackoverflow.com/questions/5670904/stack-overflow-when-debugging-but-not-in-release) –

+0

¿Está preguntando "Qué es la razón del desbordamiento? " O "¿Cuál es la razón por la cual el comportamiento cambia en diferentes modos de compilación?" ¿O algo mas? –

Respuesta

11

Como la pila es bastante pequeña, aproximadamente 1 MB en la mayoría de los sistemas, la está desbordando con sus grandes memorias intermedias. Para solucionarlo, simplemente asigne en el montón como este:

#include <iostream> 

using namespace std; 
int main() 
{ 
    char* w = new char[1000001]; 
    char* temp = new char[1000001]; 
    cout<<"Why?"<<endl; 
    delete[] w; 
    delete[] temp; 
    return 0; 
} 
+2

o usa 'std :: vector' como alguien más ya ha sugerido! –

5

La pila es bastante pequeña (~ 1MB). Lo estás llenando con la gran cantidad de elementos en esas matrices.

Si necesita más espacio, intente asignar en el montón (lo que hacen los punteros).

Una buena forma de implementar esto es con vectores, que internamente guardar cosas en el montón:

std::vector<char> w (1000001); 
std::vector<char> temp (1000001); 
4

matrices en el almacenamiento automático se asignan en la pila. El espacio de la pila es limitado. Cuando el espacio en la pila es insuficiente para asignar variables automáticas, se produce una excepción de desbordamiento de pila.

Si necesita arreglos tan grandes, use en cambio asignación estática o dinámica.

Para la asignación estática, mueva las declaraciones al exterior main().

para la asignación dinámica, utilice el código de abajo:

char *w = new char[1000001], *temp = new char[1000001]; 
// Work with w and temp as usual, then 
delete[] w; 
delete[] temp; 

Por último, considerar el uso de contenedores estándar en lugar de matrices de civil: std::array es una mejor matriz si no es necesario cambiar el tamaño (que se asigna en la pila, y no resolverá este problema); std::string es también un buen candidato para reemplazar matrices char.

+2

No creo que 'std :: array' resuelva su problema. * * Aún * asignará los datos en la pila. Prueba 'std :: vector'. –

+0

@ Robᵩ ¡Tienes razón, no lo haría! Mencioné 'std :: array' como reemplazo de arreglos simples, no como una forma de resolver este problema en particular. Puedo ver cómo esta parte de la respuesta podría ser engañosa, así que la edité para mayor claridad. ¡Gracias! – dasblinkenlight

5

Está asignando demasiadas cosas en la pila; probablemente en modo de depuración, la pila está más ocupada debido a las diversas comprobaciones de seguridad, o es intencionalmente más pequeña para ayudarlo a detectar dichos problemas antes. De todos modos, hacer las matrices un poco más grandes desencadenará un desbordamiento de la pila, incluso en modo de lanzamiento (a menos que el compilador las optimice por completo).

La raíz del problema aquí es que no debe asignar grandes elementos en la pila, que es bastante limitado en tamaño (1 MB de forma predeterminada en Windows con VC++) y debe utilizarse solo para pequeños almacenamientos intermedios/objetos. Si necesita hacer grandes asignaciones, hágalo en el montón (con new/malloc), preferiblemente utilizando punteros inteligentes para evitar pérdidas de memoria.

Cuestiones relacionadas