C6263
تحذير C6263: استخدام _alloca في تكرار حلقي؛ ذلك أن سرعة تجاوز المكدس
هذا التحذير يشير إلى ذلك _alloca استدعاء داخل تكرار حلقي يخصص ذاكرة قد يؤدي تجاوز سعة المكدس. _alloca بتخصيص ذاكرة من بنية تخزين العناصر، ولكن تلك ذاكرة هو تحرير فقط عندما يتم إنهاء استدعاء دالة. مكدس ذاكرة مؤقتة، حتى في الوضع مستخدم، هو محدودة، وفشل في تنفيذ صفحة مكدس يتسبب استثناء تجاوز سعة مكدس. _resetstkoflwاسترداد دالة من شرط تجاوز سعة مكدس الذاكرة مؤقتة، السماح لأحد برامج إلى متابعة بدلاً من تعرض للفشل مع خطأ استثناء فادح. إذا _resetstkoflwدالة هو لا تسمى، هناك هو لم توجد صفحة الحماية بعد استثناء السابقة. المرة القادمة التي هو تجاوز سعة مكدس الذاكرة مؤقتة، لا توجد أية استثناءات في كل وإنهاء العملية بدون تحذير.
يجب تجنب استدعاء _allocaداخل حلقة إذا عد تكرار أو الحجم تخصيص هو غير مجهول لأنه قد يتسبب في تجاوز سعة المكدس. في هذه الحالات، خذ بعين الاعتبار الخيارات الأخرى مثل، ذاكرة كومة ذاكرة مؤقتة، أو C++ القياسية أعضاء البيانات المرجعفئات.
مثال
يلي تعليمات برمجية ينشئ هذا التحذير:
#include <windows.h>
#include <malloc.h>
#include <excpt.h>
#include <stdio.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
__try
{
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *)_alloca(size);
// process cArray...
}
}
__except(GetExceptionCode() == STATUS_STACK_OVERFLOW ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
{
// code...
puts("Allocation Failed");
_resetstkoflw();
}
}
يلي تعليمات برمجية يستخدم malloc () لحل هذا التحذير:
#include <windows.h>
#define MAX_SIZE 50
void f ( int size )
{
char* cArray;
for(int i = 0; i < MAX_SIZE; i++)
{
cArray = (char *) malloc(size);
if (cArray != NULL)
{
// process cArray...
free(cArray);
}
}
}