alloca()
allocates memory on the stack rather than on the heap, as in the case of malloc()
. So, when I return from the routine the memory is freed.
One pitfall with alloca
is that longjmp
rewinds it.
That is to say, if you save a context with setjmp
, then alloca
some memory, then longjmp
to the context, you may lose the alloca
memory. The stack pointer is back where it was and so the memory is no longer reserved; if you call a function or do another alloca
, you will clobber the original alloca
.
To clarify, what I'm specifically referring to here is a situation whereby longjmp
does not return out of the function where the alloca
took place! Rather, a function saves context with setjmp
; then allocates memory with alloca
and finally a longjmp takes place to that context. That function's alloca
memory is not all freed; just all the memory that it allocated since the setjmp
. Of course, I'm speaking about an observed behavior; no such requirement is documented of any alloca
that I know.
The focus in the documentation is usually on the concept that alloca
memory is associated with a function activation, not with any block; that multiple invocations of alloca
just grab more stack memory which is all released when the function terminates. Not so; the memory is actually associated with the procedure context. When the context is restored with longjmp
, so is the prior alloca
state. It's a consequence of the stack pointer register itself being used for allocation, and also (necessarily) saved and restored in the jmp_buf
.
Incidentally, this, if it works that way, provides a plausible mechanism for deliberately freeing memory that was allocated with alloca
.
I have run into this as the root cause of a bug.