2014-04-24 12 views
8

Ich verwende Visual Studio 2010 mit Code Analysis aktiviert. In meinem Code gibt es eine Zeile etwas Speicher in einer Funktion Zuweisung:Warnmeldung bezüglich Stapelgröße

TCHAR someString[40000]; 

Die Codeanalyse wirft eine Warnmeldung:

Warnung C6262: Funktion '40000' Bytes Stack verwendet: überschreitet/analysieren: stacksize'16384 '. Betrachten Sie einige Daten in den Heap

Ich frage mich, ob ich die Warnung ernst nehmen sollte. Muss ich einige echte Probleme haben, wenn ich etwas Speicher auf dem Stack> 16384 zuteile? Oder ist es nur eine allgemeine Warnmeldung, die mich daran erinnert, dass ich generell auf meine Stackgröße achten muss? Soweit ich weiß, ist die Standard-Stack-Größe 1 MB (wenn Sie Visual Studio verwenden).

+0

Ich habe keine Probleme damit – Quest

+0

Wenn diese Funktion keine Rekursion verwendet und ist die einzige Funktion, die viel Stapelspeicher zuweist, sollte es in Ordnung sein. Trotzdem sollten Sie es in Betracht ziehen, es für alle Fälle auf den Heap zu verschieben. – Kelm

+1

@MichaelXanadu: Es gibt eine gute Erklärung dazu auf der MSDN-Seite: http://msdn.microsoft.com/en-us/library/7yhee2f0.aspx. Auf dieser Seite wurde vorgeschlagen, Raw-Heap-Speicher oder besser STL-Container zu verwenden als std :: string std :: vector in diesem Fall. –

Antwort

5

Zugegebenermaßen kann diese Nachricht verwirrend sein, da VS (Projekteigenschaften) meldet, dass der Standardwert 1M ist. Wenn Sie jedoch den Text der warning betrachten, werden Sie feststellen, dass das Limit tatsächlich 16.000 für die Codeanalyse beträgt. Befolgen Sie die Schritte unten in diesem Link, um die Warnung zu korrigieren.

+0

Also die Stack-Größe ist wirklich 1 MB und die Warnmeldung wird jedes Mal ausgelöst, wenn die Stack-Größe einen definierten Schwellenwert (z. B. 16K) überschreitet? – MichaelXanadu

+1

Ja. Für die Code-Analyse beträgt die Stackgröße 16k, sofern Sie sie nicht ändern. Sie können dieses Limit beim Ausführen der Analyse überschreiben. – rrirower

+3

@rrirower: nicht ganz. Die Codeanalyse berücksichtigt den Stack nicht als 16k, sondern betrachtet ihn nur als verdächtig, wenn eine einzelne Funktion mehr als 16k des Stacks verwendet. Das ist ganz anders. OTOH Ich wünschte wirklich, die Warnung würde die größten Variablen auf dem Stack für mich auflisten: / –

1

Ich fand, dass solche Warnungen ernst genommen werden müssen. Ich hatte eine Erklärung

{ // some local branch deep inside a function 
char T[2000000]; 
    ... 
} 

versehentlich tief im Inneren einer großen Funktion irgendwo links. Die Funktion stürzte immer sofort nach dem Eintritt in die Funktion ab, auch wenn die Deklaration im lokalen Zweig weit entfernt war, und ich kam nie mit dem Debugger dorthin. Es war schwierig, in MS Visual Studio zu finden, selbst wenn die Codeanalyse mich warnte.