Freigeben über


C6263

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 Reservieren von Arbeitsspeicher einen Stapelüberlauf verursachen kann. Mit _alloca wird Arbeitsspeicher vom Stapel reserviert, 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 Reservierungsgröß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[MAX_SIZE];
  __try
  {
    for(int i = 0; i < MAX_SIZE; i++)
    {
      cArray[i]= (char *)_alloca(size);
     // TODO: Add code
    }
  }
  __except(GetExceptionCode() == STATUS_STACK_OVERFLOW )
  {
     // TODO: Add code
     puts("Allocation Failed");
    _resetstkoflw();
  }
}

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

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

#define MAX_SIZE 50

void f ( int size )
{
  char* cArray[MAX_SIZE];
  
  for(int i = 0; i < MAX_SIZE; i++)
  {
    cArray[i]= (char *) malloc(size);
    // TODO: Add code
  }

  // Cleanup code
  for(int i=0; i< MAX_SIZE; i++)
  {
    free(cArray[i]);
  }
}

Siehe auch

Referenz

malloc
_alloca
_malloca

Weitere Ressourcen

Standard C++ Library Reference