[Rd] Basic Question regarding PROTECT

Saptarshi Guha saptarshi.guha at gmail.com
Mon Aug 24 15:33:14 CEST 2009

Thank you. So the reason I wouldnt need to protect y had I returned to
R, is because
had i had done something like

where "boo" contains y=foo()

the assignment "<-" to h would have a PROTECT somewhere, i.e R's
assignment is doing the protection for me.
Had I not returned to R, I would have to do it myself.

Yes PROTECT is quite cheap, I had thought it to be costly but 1MM
PROTECT/UNPROTECT calls, takes <1 second  (on a macbook 2.16ghz)

Thanks for the explanation.

On Mon, Aug 24, 2009 at 9:24 AM, Duncan Murdoch<murdoch at stats.uwo.ca> wrote:
> On 8/24/2009 9:10 AM, Sapsi wrote:
>> Hello
>> Thank you for the response. So if my call is
>> y=foo()
>> z=malloc ( by memory allocations , do you mean via R_alloc and
>>  allocVector and malloc or just the former two)
> Any allocation which is managed by R's memory manager, so that includes the
> former two, and many other kinds of calls which do allocations, i.e.
> essentially any call to the R API unless it's documented not to do
> allocations. In most cases calling PROTECT is quite cheap, so it is worth
> doing if you're not sure.  (There are exceptions:  because the PROTECT stack
> is finite, you can overflow it if you PROTECT too much. That could happen in
> a loop or a deep recursion.)
>> Other statements
>> Then I need  to protect y. And in my case I don't return to R since I
>>  have embedded it.
>> Why is this the case I.e if I perform mem allocs , I need to protect y
> Because R's memory manager does automatic garbage collection.  If you don't
> protect y, then the memory manager will not know that it is still in use.
>  The next time it needs some memory it may decide to free y and re-use that
> space.
> Duncan Murdoch
>> On Aug 24, 2009, at 8:18 AM, Duncan Murdoch <murdoch at stats.uwo.ca>
>> wrote:r
>> C
>>> On 8/23/2009 11:52 PM, Saptarshi Guha wrote:
>>>> Hello,
>>>> Suppose I have the function
>>>> SEXP foo(){
>>>> SEXP s;
>>>> PROTECT(s=allocVector(...))
>>>> ....
>>>> UNPROTECT(1);
>>>> return(s)
>>>> }
>>>> y=foo() // foo is a recusrive call
>>>> Q: Am i correct in understanding that one does not need to write
>>>> PROTECT(y=foo()) ?(and a corresponding unprotect  later on)
>>>> since it is the object that is protected , SEXP is an alias for
>>>> SEXPREC* and allocVector probably does some memory allocation which
>>>> does not get freed
>>>> when foo returns.
>>> Whether y needs protecting depends on what happens between the y =  foo()
>>> call and the time you return to R.  If nothing happens, i.e.  you just
>>> return y to R, then you're safe.  If you do any memory  allocations after
>>> that call before returning to R then y will need  to be protected.
>>> Duncan Murdoch

More information about the R-devel mailing list