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