Нарушение прав доступа при использовании alloca

мой 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() \
)

6

Решение

Предполагая, что вы работаете в Windows, так как ваш код вызывает _alloca()согласно Документация MSDN:

_alloca выделяет размер байты из стека программы. Выделенное пространство автоматически освобождается при выходе из вызывающей функции

Обратите внимание, что память освобождается при выходе из вызывающей функции, что, как я полагаю, также означает, что вызывающая функция возвращается.

Ваш код:

void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}

возвращает, таким образом освобождая память, полученную через _alloca(),

9

Другие решения

Со страницы руководства,

Это временное пространство автоматически освобождается
когда функция, вызвавшая alloca (), возвращается к своему вызывающему.

Так что всякий раз, когда ваш stackAlloc функция вернется, она автоматически освободит память.

3

Это работает, но я бы посоветовал не использовать его в производстве:

#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 (либо возвращая разные лямбды, либо выполняя проверку лямбда).

0