_alloca
Yığın bellek ayırır. Daha güvenli bir sürümünü kullanılabildiği için bu işlev kaldırılmıştır; see _malloca.
void *_alloca(
size_t size
);
Parametreler
- [in]size
Yığından ayrılacak bayt.
Dönüş Değeri
_alloca Rutin döndürür bir void herhangi bir nesne türünü depolanması için yeterince hizalanacağı garanti ayrılan alanı işaretçisi. size 0, _alloca Sıfır uzunluklu öğeyi ayırır ve bu madde için geçerli bir işaretçi döndürür.
Bir yığın taşması özel alanı tahsis oluşturulur. Yığın taşması özel bir C++ özel değildir; Bu yapısal bir istisnadır. C++ özel durum işleme kullanmak yerine, kullanmanız gereken Yapılandırılmış özel durum işleme (seh).
Notlar
_allocaayırdığı size program yığından bayt. Ayrılan alan (ayırma yalnızca kapsam dışı olmayan geçtiğinde) işlevini çağırırken çıktığında otomatik olarak serbest bırakılır. Bu nedenle, döndürülen işaretçi değeri iletmeyen _alloca bağımsız değişken olarak ücretsiz.
Açıkça çağırmak için kısıtlamalar vardır _alloca , bir özel durum işleyici (eh). X çalışan eh düzenleri 86 sınıfı işlemciler kendi bellek çerçevesinde çalışması: görevlerini kapsayan işlevinin yığın işaretçisi geçerli konumuna dayalı olmayan bellek alanında gerçekleştirdikleri. En yaygın uygulamaları Windows NT yapılandırılmış özel durum işleme (seh) ve C++ catch yan tümcesi deyimleri içerir. Bu nedenle, açıkça çağırmak _alloca herhangi bir program hatası return to eh yordamı çağrılırken sırasında aşağıdaki senaryolar sonuçları:
Windows NT seh özel filtre ifadesi: __except (_alloca () )
Windows NT seh son özel durum işleyici: __finally {_alloca () }
C++ eh catch yan tümcesi deyimi
Ancak, _alloca doğrudan eh yordamı içinde veya çağrılan bir uygulama tarafından sağlanan geri yukarıda listelenen eh senaryolardan biri tarafından çağrılabilir.
Güvenlik Notu |
---|
Windows XP'de, _alloca olarak adlandırılan bir try/catch bloğu içinde çağırması gerekir _resetstkoflw catch bloğu içinde. |
Yukarıdaki sınırlamalar kullanırken, ek olarak/clr (ortak dil çalışma zamanı derleme) seçeneği, _alloca kullanılamaz __except engeller. Daha fazla bilgi için bkz: /clr kısıtlamaları.
Gereksinimler
Yordamı |
Gerekli başlık |
---|---|
_alloca |
<malloc.h> |
Örnek
// 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 occured 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)
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
.NET Framework Eşdeğeri
Yoktur. Standart c işlevi çağırmak için kullanmak PInvoke. Daha fazla bilgi için bkz: Platform Çağırma örnekleri.