_malloca

Mengalokasikan memori pada tumpukan. Fungsi ini adalah versi _alloca dengan peningkatan keamanan seperti yang dijelaskan dalam Fitur keamanan di CRT.

Sintaks

void *_malloca(
   size_t size
);

Parameter

size
Byte yang akan dialokasikan dari tumpukan.

Nilai hasil

Rutinitas _malloca mengembalikan penunjuk ke ruang yang dialokasikan, yang cocok diselaraskan void untuk penyimpanan jenis objek apa pun. Jika size adalah 0, _malloca alokasikan item panjang nol dan mengembalikan penunjuk yang valid ke item tersebut.

Jika size lebih besar dari _ALLOCA_S_THRESHOLD, maka _malloca upaya untuk mengalokasikan pada timbunan, dan mengembalikan penunjuk null jika spasi tidak dapat dialokasikan. Jika size kurang dari atau sama dengan _ALLOCA_S_THRESHOLD, maka _malloca upaya untuk mengalokasikan pada tumpukan, dan pengecualian luapan tumpukan dihasilkan jika ruang tidak dapat dialokasikan. Pengecualian luapan tumpukan bukan pengecualian C++; ini adalah pengecualian terstruktur. Alih-alih menggunakan penanganan pengecualian C++, Anda harus menggunakan Penanganan pengecualian terstruktur (SEH) untuk menangkap pengecualian ini.

Keterangan

_malloca mengalokasikan size byte dari tumpukan program atau tumpukan jika permintaan melebihi ukuran tertentu dalam byte yang diberikan oleh _ALLOCA_S_THRESHOLD. Perbedaan antara _malloca dan _alloca adalah bahwa _alloca selalu mengalokasikan pada tumpukan, terlepas dari ukurannya. Tidak seperti _alloca, yang tidak memerlukan atau mengizinkan panggilan untuk free membebaskan memori yang dialokasikan, _malloca memerlukan penggunaan _freea untuk membebaskan memori. Dalam mode debug, _malloca selalu mengalokasikan memori dari tumpukan.

Ada batasan untuk secara eksplisit memanggil _malloca dalam handler pengecualian (EH). Rutinitas EH yang berjalan pada prosesor kelas x86 beroperasi dalam bingkai memori mereka sendiri: Mereka melakukan tugas mereka di ruang memori yang tidak didasarkan pada lokasi pointer tumpukan fungsi penutup saat ini. Implementasi yang paling umum termasuk penanganan pengecualian terstruktur (SEH) Windows NT dan ekspresi klausa tangkapan C++. Oleh karena itu, secara eksplisit memanggil _malloca dalam salah satu skenario berikut mengakibatkan kegagalan program selama kembali ke rutinitas EH panggilan:

  • Ekspresi filter pengecualian WINDOWS SEH: __except (_malloca () )

  • Handler pengecualian akhir Windows SEH: __finally {_malloca () }

  • Ekspresi klausa tangkapan C++ EH

Namun, _malloca dapat dipanggil langsung dari dalam rutinitas EH atau dari panggilan balik yang disediakan aplikasi yang dipanggil oleh salah satu skenario EH yang sebelumnya tercantum.

Penting

Di Windows, jika _malloca dipanggil di dalam try/catch blok, Anda harus memanggil _resetstkoflw di blok tangkap.

Selain pembatasan di atas, saat menggunakan /clr opsi (Kompilasi Runtime Bahasa Umum),_malloca tidak dapat digunakan dalam __except blok. Untuk informasi selengkapnya, lihat /clr Pembatasan.

Persyaratan

Rutin Header yang diperlukan
_malloca <malloc.h>

Contoh: _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();
}

Contoh: _malloca pengecualian

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

Input

1000

Sampel output

Enter the number of bytes to allocate using _malloca: 1000

Baca juga

Alokasi memori
calloc
malloc
realloc
_resetstkoflw