2012-05-10 9 views
6

Ich verwende VS 2010
Wenn ich dieses Programm im Debug-Modus ausführen wirft es Stack-Überlauf Ausnahme und zeigt eine Bruchlinie in der Datei chkstk.asm in Zeile 99.
Aber Wenn ich es im Release-Modus starte, ist es in Ordnung.
Auch wenn ich die Größe eines der Arrays auf 10000 verringern, funktioniert es gut in Debug. Was ist der Grund?Stack-Überlauf Ausnahme in dem dummen Programm

#include <iostream> 

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

Welche Optimierungen haben Sie im Freigabemodus aktiviert? Es besteht eine gute Chance, dass der Compiler nur die Arrays entfernt. –

+0

möglich Duplikat [Stack-Überlauf, wenn aber nicht in Release Debuggen] (http://stackoverflow.com/questions/5670904/stack-overflow-when-debugging-but-not-in-release) –

+0

Sind Sie fragen: „Was ist der Grund für den Überlauf? " Oder "Was ist der Grund, dass sich das Verhalten in verschiedenen Build-Modi ändert?" Oder etwas anderes? –

Antwort

11

Da der Stapel ist ziemlich klein, ca. 1MB auf den meisten Systemen, sind Sie es mit Ihrem großen Puffer überfüllt. Um das zu beheben, ordne einfach auf dem Heap wie folgt zu:

#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

oder verwenden Sie 'std :: vector' wie jemand anders bereits vorgeschlagen! –

5

Der Stapel ist ziemlich klein (~ 1MB). Sie füllen es mit der riesigen Anzahl von Elementen in diesen Arrays.

Wenn Sie mehr Speicherplatz benötigen, versuchen Sie auf dem Heap Zuweisung (die Zeiger tun).

Ein guter Weg, dies zu implementieren ist mit Vektoren, die intern speichern Dinge auf dem Heap:

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

Arrays im automatischen Speicher auf dem Stack zugeordnet. Stapelplatz ist begrenzt. Wenn der Speicherplatz auf dem Stapel nicht ausreicht, um automatische Variablen zuzuweisen, tritt eine Stapelüberlaufausnahme auf.

Wenn Sie Arrays benötigen, die große, verwenden Sie statische oder dynamische Zuordnung statt.

Für die statische Zuordnung, bewegen Erklärungen außerhalb main().

Für die dynamische Zuordnung, verwenden Sie den Code unten: mit Standard-Container anstelle von einfachen Arrays

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

Schließlich betrachten: std::array ist eine bessere Array, wenn Sie die Größenänderung nicht brauchen (es auf dem Stapel zugeordnet ist, und wird dieses Problem nicht lösen); std::string ist auch ein guter Kandidat, char Arrays zu ersetzen.

+2

Ich glaube nicht, dass 'std :: array' sein Problem lösen wird. Es wird * noch * die Daten auf dem Stapel zuordnen. Versuchen Sie 'std :: vector'. –

+0

@ Robᵩ Du hast Recht, es würde nicht! Ich habe "std :: array" als Ersatz für einfache Arrays erwähnt, nicht als eine Möglichkeit, dieses spezielle Problem zu lösen. Ich kann sehen, wie dieser Teil der Antwort irreführend sein könnte, also habe ich ihn aus Gründen der Klarheit überarbeitet. Vielen Dank! – dasblinkenlight

5

Du Zuteilung zu viel Material auf dem Stapel; wahrscheinlich im Debug-Modus ist der Stack aufgrund der verschiedenen Sicherheitschecks mehr belegt oder ist absichtlich kleiner, um solche Probleme früher zu erkennen. Wie auch immer, wenn die Arrays ein wenig größer werden, wird selbst im Freigabemodus ein Stapelüberlauf ausgelöst (es sei denn, der Compiler optimiert sie vollständig).

Der Grund des Problems hier ist, dass Sie nicht große Sachen auf dem Stapel zuweisen sollten, der in der Größe ziemlich begrenzt ist (1 MB standardmäßig unter Windows mit VC++) und sollte nur für kleine Puffer/Objekte verwendet werden. Wenn Sie große Zuweisungen vornehmen müssen, tun Sie dies auf dem Heap (mit new/malloc), vorzugsweise mit intelligenten Zeigern, um Speicherlecks zu vermeiden.

Verwandte Themen