Freigeben über


_malloca

Belegt Speicher für den Stapel.Dies ist eine Version von _alloca mit unter Security Enhancements, wie in Sicherheitsfeatures im CRTbeschrieben.

void *_malloca( 
   size_t size 
);

Parameter

  • size
    Vom Stapel zu belegenden Bytes.

Rückgabewert

Die _malloca Routine gibt einen void Zeiger auf den belegten Platz zurück, der auf jeden Fall zum Speichern eines beliebigen Typs - Objekt ordnungsgemäß ausgerichtet werden soll.Wenn size 0 ist, wird die Länge 0 _malloca ein Element und einen gültigen Zeiger auf dieses Element zurück.

Eine Stapelüberlaufausnahme wird generiert, wenn das Leerzeichen nicht zugeordnet werden kann.Die Stapelüberlaufausnahme ist keine Ausnahme in C++. Dies ist eine strukturierte Ausnahme.Anstatt die behandelnde C++-Ausnahmebehandlung zu verwenden, müssen Sie Strukturierte Ausnahmebehandlung (SEH) verwenden.

Hinweise

_malloca ordnet size Bytes aus dem Programm stapel oder vom Heap, wenn die Anforderung eine bestimmte Größe in Bytes angegeben durch _ALLOCA_S_THRESHOLDüberschreitet.Der Unterschied zwischen _malloca und _alloca besteht darin, dass _alloca immer auf dem Stapel reserviert, unabhängig von der Größe.Im Gegensatz zu _allocader keinen Aufruf an den free so zugeordneten Arbeitsspeicher freizugeben _malloca benötigt oder zulässt, erfordert die Verwendung von _freea , Arbeitsspeicher freizugeben.Im Debugmodus _malloca immer vom Heap belegt Speicher.

Es gibt Einschränkungen _malloca in einem Ausnahmehandler (EH) explizit aufrufen.Eh-Routinen, die auf x86-class Prozessoren ausgeführt werden, verwenden in ihren eigenen Arbeitsspeicher framen: Sie führen ihre Aufgaben im Bereich Store aus, der nicht auf Grundlage der aktuellen Position des Stapels zeigers der einschließende Funktion ist.Die am häufigsten verwendeten Implementierungen enthalten Ausdrücke der strukturierten ausnahmebehandlung Windows NT (SEH) und C++-catch-Klausel.Daher _malloca in den folgenden Szenarien führt explizit aufrufen, während Programmfehler der Rückgabe an die aufrufende EH-Routine:

  • Windows NT SEH Ausnahme filterausdruck: __except(_malloca () )

  • Windows NT SEH abschließender Ausnahmehandler: __finally {_malloca () }

  • Catch-Klausel-Ausdruck C++ EH

Allerdings kann direkt aus einer _malloca EH-Routine oder einem von der Anwendung bereitgestellten Rückruf aufgerufen werden, der durch den Aufruf eines der zuvor aufgelisteten EH-Szenarien abruft.

SicherheitshinweisSicherheitshinweis

Unter Windows XP wenn _malloca in einem try/catch-Block aufgerufen werden muss, müssen Sie _resetstkoflw im catch-Block aufrufen.

Neben den oben beschriebenen Einschränkungen wenn die /clr (Common Language Runtime Compilation) Option, _malloca kann nicht in __except Blöcken verwendet wird.Weitere Informationen finden Sie unter Einschränkungen /clr-.

Anforderungen

Routine

Erforderlicher Header

_malloca

<malloc.h>

Beispiel

// 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();
}

// 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

.NET Framework-Entsprechung

Nicht zutreffend. Um die Standard-C-Funktion aufrufen, verwenden Sie PInvoke. Weitere Informationen finden Sie unter Plattformaufruf-Beispiele.

Siehe auch

Referenz

Speicherbelegung

calloc

malloc

realloc

_resetstkoflw