2012-05-10 15 views
6

Sto utilizzando VS 2010.
Quando ho eseguito questo programma in modalità debug viene generata un'eccezione di overflow stack e mostra una linea di discontinuità nel file chkstk.asm alla linea 99.
Ma quando lo eseguo in modalità Release è OK.
Inoltre, se si riduce la dimensione di uno degli array a 10000, funziona correttamente in Debug. Qual è il motivo?stack eccezione di overflow nel programma stupido

#include <iostream> 

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

Quali ottimizzazioni sono state abilitate in modalità di rilascio? C'è una buona possibilità che il compilatore stia semplicemente rimuovendo gli array. –

+0

possibile duplicato di [Overflow dello stack durante il debug ma non nel rilascio] (http://stackoverflow.com/questions/5670904/stack-overflow-when-debugging-but-not-in-release) –

+0

Stai chiedendo "Che cos'è il motivo per l'overflow? " O "Qual è la ragione per cui il comportamento cambia in diverse modalità di compilazione?" O qualcos'altro? –

risposta

11

Poiché lo stack è piuttosto piccolo, circa 1 MB nella maggior parte dei sistemi, lo si sta sovraccaricando con i buffer di grandi dimensioni. Per risolvere il problema, è sufficiente allocare nell'heap in questo modo:

#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' come qualcun altro già suggerito! –

5

Lo stack è piuttosto piccolo (~ 1 MB). Lo stai riempiendo con l'enorme numero di elementi in quegli array.

Se hai bisogno di più spazio, prova ad allocare sull'heap (quali sono i puntatori).

Un modo per implementare questo è con vettori, che internamente attrattive memorizzare sul mucchio:

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

Arrays nella memorizzazione automatica sono allocati sullo stack. Lo spazio dello stack è limitato. Quando lo spazio nello stack non è sufficiente per allocare le variabili automatiche, si verifica un'eccezione di overflow dello stack.

Se sono necessari array di grandi dimensioni, utilizzare invece allocazione statica o dinamica.

Per l'allocazione statica, spostare le dichiarazioni all'esterno main().

per l'allocazione dinamica, utilizzare il codice qui sotto:

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

Infine, è consigliabile utilizzare contenitori standard invece di array strisciamento: std::array è una matrice meglio se non è necessario il ridimensionamento (è allocato sullo stack, e non risolverà questo problema); std::string è anche un buon candidato per sostituire gli array char.

+2

Non penso che 'std :: array' risolverà il suo problema. * * * Allocherà i dati nello stack. Prova 'std :: vector'. –

+0

@ Robᵩ Hai ragione, non sarebbe! Ho menzionato 'std :: array' come rimpiazzo degli array semplici, non come un modo per risolvere questo particolare problema. Posso vedere come questa parte della risposta potrebbe essere fuorviante, quindi l'ho modificata per chiarezza. Grazie! – dasblinkenlight

5

Stai allocando troppa roba in pila; probabilmente in modalità debug lo stack è più occupato a causa dei vari controlli di sicurezza, oppure è intenzionalmente più piccolo per aiutarti a rilevare tali problemi in precedenza. In ogni caso, rendendo gli array un po 'più grandi si innesca uno stack overflow anche in modalità release (a meno che il compilatore non li ottimizzi del tutto).

La radice del problema qui è che non si devono allocare grandi cose nello stack, che è abbastanza limitato nelle dimensioni (1 MB di default su Windows con VC++) e dovrebbe essere usato solo per piccoli buffer/oggetti. Se è necessario eseguire allocazioni di grandi dimensioni, eseguirle nell'heap (con new/malloc), preferibilmente utilizzando puntatori intelligenti per evitare perdite di memoria.

Problemi correlati