мой stackAlloc
функция выглядит так:
void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}
void stackAllocFree(void *ptr, size_t size) {
if (size > maxStackAllocation) {
free(ptr);
}
}
Если я изменю так stackAlloc
функция всегда использовать malloc
вместо alloca
все работает.
Я изменил функцию на макрос, и теперь она работает как положено:
#define maxStackAllocation 1024
#define stackAlloc(size) \
( \
(size > maxStackAllocation)? \
malloc(size): \
_alloca(size) \
)
#define stackAllocFree(ptr, size) \
( \
(size > maxStackAllocation)? \
free(ptr): \
void() \
)
Предполагая, что вы работаете в Windows, так как ваш код вызывает _alloca()
согласно Документация MSDN:
_alloca выделяет размер байты из стека программы. Выделенное пространство автоматически освобождается при выходе из вызывающей функции
Обратите внимание, что память освобождается при выходе из вызывающей функции, что, как я полагаю, также означает, что вызывающая функция возвращается.
Ваш код:
void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}
возвращает, таким образом освобождая память, полученную через _alloca()
,
Это временное пространство автоматически освобождается
когда функция, вызвавшая alloca (), возвращается к своему вызывающему.
Так что всякий раз, когда ваш stackAlloc
функция вернется, она автоматически освободит память.
Это работает, но я бы посоветовал не использовать его в производстве:
#include <iostream>
#include <alloca.h>
auto stackAlloc(const size_t size)
{
return [size](){ return alloca(size); };
}
int main() {
char *ch = (char *)stackAlloc(40000)();
ch[39999] = '\0';
return 0;
}
Контр-проверка: если я уменьшу параметр stackAlloc, он не будет работать (что является ожидаемым поведением здесь)
Не стесняйтесь добавлять чек и т. Д. В stackAlloc (либо возвращая разные лямбды, либо выполняя проверку лямбда).