_alloca
Mengalokasikan memori pada tumpukan. Fungsi ini tidak digunakan lagi karena versi yang lebih aman tersedia; lihat _malloca
.
Sintaks
void *_alloca(
size_t size
);
Parameter
size
Byte yang akan dialokasikan dari tumpukan.
Nilai hasil
Rutinitas _alloca
mengembalikan penunjuk ke ruang yang dialokasikan, yang cocok diselaraskan void
untuk penyimpanan jenis objek apa pun. Jika size
adalah 0, _alloca
alokasikan item panjang nol dan mengembalikan penunjuk yang valid ke item tersebut.
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).
Keterangan
_alloca
mengalokasikan size
byte dari tumpukan program. Ruang yang dialokasikan secara otomatis dibesarkan ketika fungsi panggilan keluar (bukan ketika alokasi hanya pingsan dari cakupan). Oleh karena itu, jangan meneruskan nilai penunjuk yang dikembalikan oleh _alloca
sebagai argumen ke free
.
Ada batasan untuk secara eksplisit memanggil _alloca
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 Windows (SEH) dan ekspresi klausa tangkapan C++. Oleh karena itu, secara eksplisit memanggil _alloca
dalam salah satu skenario berikut mengakibatkan kegagalan program selama kembali ke rutinitas EH panggilan:
Ekspresi filter pengecualian Windows SEH:
__except ( _alloca() )
Handler pengecualian akhir Windows SEH:
__finally { _alloca() }
Ekspresi klausa tangkapan C++ EH
Namun, _alloca
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
Jika _alloca
dipanggil di dalam blok percobaan, Anda harus memanggil _resetstkoflw
di blok tangkapan.
Selain pembatasan di atas, saat menggunakan/clr
opsi (Kompilasi Runtime Bahasa Umum),_alloca
tidak dapat digunakan dalam __except
blok. Untuk informasi selengkapnya, lihat /clr
Pembatasan.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
_alloca |
<malloc.h> |
Contoh
// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size = 1000;
int errcode = 0;
void *pData = NULL;
// Note: Do not use try/catch for _alloca,
// use __try/__except, since _alloca throws
// Structured Exceptions, not C++ exceptions.
__try {
// An unbounded _alloca can easily result in a
// stack overflow.
// Checking for a size < 1024 bytes is recommended.
if (size > 0 && size < 1024)
{
pData = _alloca( size );
printf_s( "Allocated %d bytes of stack at 0x%p",
size, pData);
}
else
{
printf_s("Tried to allocate too many bytes.\n");
}
}
// If an exception occurred with the _alloca function
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_alloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode == 0) // _resetstkoflw() returns 0 on failure
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Allocated 1000 bytes of stack at 0x0012FB50
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk