Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Belegt Speicher für den Stapel. Diese Funktion ist eine Version von _alloca Sicherheitsverbesserungen, wie in den Sicherheitsfeatures im CRT beschrieben.
Syntax
void *_malloca(
size_t size
);
Parameter
size
Bytes, die vom Stapel zugeordnet werden.
Rückgabewert
Die _malloca Routine gibt einen void Zeiger auf den zugewiesenen Bereich zurück, der entsprechend für die Speicherung eines beliebigen Objekttyps ausgerichtet ist. Wenn size 0 ist, weist _malloca ein Element der Länge 0 zu und gibt einen gültigen Zeiger auf dieses Element zurück.
Wenn size größer als _ALLOCA_S_THRESHOLDist, _malloca wird versucht, den Heap zuzuweisen, und gibt einen NULL-Zeiger zurück, wenn der Leerraum nicht zugewiesen werden kann. Wenn size kleiner oder gleich _ALLOCA_S_THRESHOLDist, wird versucht, _malloca den Stapel zuzuweisen, und eine Stapelüberlaufausnahme wird generiert, wenn der Speicherplatz nicht zugewiesen werden kann. Die Stapelüberlaufausnahme ist keine C++-Ausnahme; es ist eine strukturierte Ausnahme. Anstatt die C++-Ausnahmebehandlung zu verwenden, müssen Sie die strukturierte Ausnahmebehandlung (Structured Exception Handling, SEH) verwenden, um diese Ausnahme abzufangen.
Hinweise
_malloca ordnet size-Bytes aus dem Programmstapel oder dem Heap zu, wenn die Anforderung eine bestimmte Größe in Bytes überschreitet, die von _ALLOCA_S_THRESHOLD angegeben ist. Der Unterschied zwischen _malloca und _alloca ist, dass _alloca immer auf dem Stapel zuordnet, unabhängig von der Größe. Im Gegensatz dazu _alloca, was keinen Aufruf erfordert oder zulässt, um den so zugewiesenen Speicher freizugeben free , _malloca erfordert die Verwendung des freizugebenden _freea Arbeitsspeichers. Im Debugmodus weist _malloca immer Speicher vom Heap zu.
Es gelten Einschränkungen beim expliziten Aufruf von _malloca in einem Ausnahmehandler (exception handler, EH). EH-Routinen, die auf x86-Prozessoren ausgeführt werden, arbeiten in ihrem eigenen Speicherframe: Sie führen ihre Aufgaben im Arbeitsspeicher aus, die nicht auf der aktuellen Position des Stapelzeigers der eingeschlossenen Funktion basieren. Die am häufigsten verwendeten Implementierungen umfassen die strukturierte Windows NT-Ausnahmebehandlung (SEH) und C++-Catch-Klauselausdrücke. Daher führt das explizite Aufrufen von _malloca in jedem der folgenden Szenarios zu einem Programmfehler während der Rückgabe auf die aufrufende EH-Routine.
Windows SEH-Ausnahmefilterausdruck:
__except(_malloca ())Endgültige Ausnahmehandler für Windows SEH:
__finally{_malloca ()}C++-EH-Catch-Klauselausdruck
Allerdings kann _malloca direkt innerhalb einer EH-Routine aufgerufen werden oder von einem von einer Anwendung bereitgestellten Rückruf, der von einem der zuvor aufgeführten EH-Szenarios aufgerufen wird.
Wichtig
Wenn in Windows _malloca innerhalb eines try/catch Blocks aufgerufen wird, müssen Sie den Catch-Block aufrufen _resetstkoflw .
Zusätzlich zu den oben genannten Einschränkungen kann bei Verwendung der /clr nicht in Blöcken verwendet werden. Weitere Informationen finden Sie unter /clr Einschränkungen.
Anforderungen
| Routine | Erforderlicher Header |
|---|---|
_malloca |
<malloc.h> |
Beispiel: _malloca
// crt_malloca_simple.c
#include <stdio.h>
#include <malloc.h>
void Fn()
{
char * buf = (char *)_malloca( 100 );
// do something with buf
_freea( buf );
}
int main()
{
Fn();
}
Beispiel: _malloca Ausnahme
// crt_malloca_exception.c
// This program demonstrates the use of
// _malloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size;
int numberRead = 0;
int errcode = 0;
void *p = NULL;
void *pMarker = NULL;
while (numberRead == 0)
{
printf_s("Enter the number of bytes to allocate "
"using _malloca: ");
numberRead = scanf_s("%d", &size);
}
// Do not use try/catch for _malloca,
// use __try/__except, since _malloca throws
// Structured Exceptions, not C++ exceptions.
__try
{
if (size > 0)
{
p = _malloca( size );
}
else
{
printf_s("Size must be a positive number.");
}
_freea( p );
}
// Catch any exceptions that may occur.
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_malloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode)
{
printf("Could not reset the stack!");
_exit(1);
}
};
}
Eingabe
1000
Beispielausgabe
Enter the number of bytes to allocate using _malloca: 1000