Freigeben über


C6263

Warnung C6263: Verwendung von _alloca in einer Schleife: Dies kann schnell zu einem Stapelüberlauf führen.

Diese Warnung gibt an, dass der Aufruf von _alloca in einer Schleife zum Belegen von Arbeitsspeicher einen Stapelüberlauf verursachen kann. Mit _alloca wird Arbeitsspeicher vom Stapel belegt, aber dieser Arbeitsspeicher wird nur freigegeben, wenn die aufrufende Funktion beendet wird. Für den Stapel gilt – auch im Benutzermodus – eine Beschränkung, und eine fehlgeschlagene Ausführung einer Stapelseite führt zu einem Überlauf des Stapels. Die _resetstkoflw-Funktion sorgt nach Stapelüberläufen für eine Wiederherstellung, sodass ein Programm fortgesetzt werden kann, statt mit einem schwerwiegenden Ausnahmefehler fehlzuschlagen. Wenn die _resetstkoflw-Funktion nicht aufgerufen wird, folgt auf die vorherige Ausnahme keine Schutzseite. Beim nächsten Stapelüberlauf treten keine Ausnahmen auf, und der Prozess wird ohne Ausgabe einer Warnung beendet.

Sie sollten das Aufrufen von _alloca in einer Schleife vermeiden, wenn die Belegungsgröße oder die Anzahl der Iterationen unbekannt ist, da es zu einem Stapelüberlauf kommen kann. Erwägen Sie in diesen Fällen andere Optionen, z. B. Heapspeicher oder Standard C++ Library Reference-Klassen.

Beispiel

Der folgende Code generiert diese Warnung:

#include <windows.h>
#include <malloc.h>
#include <excpt.h>
#include <stdio.h>

#define MAX_SIZE 50

void f ( int size )
{
  char* cArray;
  __try
  {
    for(int i = 0; i < MAX_SIZE; i++)
    {
      cArray = (char *)_alloca(size);

     // process cArray...
    }
  }
  __except(GetExceptionCode() == STATUS_STACK_OVERFLOW ? 
              EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
  {
     // code...
     puts("Allocation Failed");
    _resetstkoflw();
  }
}

Im folgenden Code wird malloc() verwendet, um die Warnung zu korrigieren:

#include <windows.h>
#define MAX_SIZE 50

void f ( int size )
{
  char* cArray;

  for(int i = 0; i < MAX_SIZE; i++)
  {
     cArray = (char *) malloc(size);
     if (cArray != NULL)
     {
       // process cArray...
       free(cArray);
     }
  }
}

Siehe auch

Referenz

malloc

_alloca

_malloca

Weitere Ressourcen

Standard C++ Library Reference