Память, выделенная с помощью alloca, освобождается в конце функции или в конце области видимости? - PullRequest
9 голосов
/ 23 марта 2011

Если у меня есть такая функция:

void bla(int size) {
    while(b){
        char tmp[size];
        ......
    }
}

tmp освобождается на каждой итерации цикла while, верно?

Если я напишу эту функцию:

void bla(int size) {
    while(b){
        char* tmp = alloca(size);
        ......
    }
}

tmp освобождается в конце области или в конце функции?

Ответы [ 3 ]

8 голосов
/ 23 марта 2011

Он будет освобожден в конце функции, но поскольку вы вызовете alloca() внутри цикла, вы, вероятно, получите переполнение стека. Если size не изменяется внутри функции, вы должны вызвать alloca() перед циклом.

3 голосов
/ 23 марта 2011

alloca размещается в стеке и не знает об областях, поэтому освобождается после выхода из стекового фрейма (= после выхода из функции).

2 голосов
/ 23 марта 2011

Память, выделенная с помощью alloca(), освобождается при выходе из функции.См., Например, справочную страницу для получения дополнительной информации.

Что касается первого случая, просто авто-переменной в области, я не уверен, как вы определите, что она получает "освобожденный».Вы не можете ссылаться на него вне области, которая его определяет, и если бы он имел инициализатор, он будет повторно инициализироваться на каждой итерации.

...