[Rd] The finalizer of the externalPtr does not work when closing R?

Gábor Csárdi c@@rd|@g@bor @end|ng |rom gm@||@com
Fri Apr 3 15:04:53 CEST 2020


See R_RegisterCFinalizerEx() and set onexit to nonzero. Here:
https://github.com/wch/r-source/blob/9353ddfa8d30069ad8975e0364307d710f2488d5/src/include/Rinternals.h#L1279-L1280

Gabor

On Fri, Apr 3, 2020 at 1:56 PM Wang Jiefei <szwjf08 using gmail.com> wrote:
>
> Hi all,
>
> I found that the finalizer of the externalPtr is not called when R is
> quitting. However, manually calling GC() works fine. This behavior is
> observed on devel R 2020-04-02 r78142 on Win and R 3.6.3 on Ubuntu.  I make
> a reproducible package here: https://github.com/Jiefei-Wang/example
>
> Here is the detail of how to reproduce the problem, I create a temporary
> file in the package root path and make an external pointer. The finalizer
> of the external pointer will delete the  temporary file when it is called.
> In the first round, I manually remove the external pointer from the global
> environment and call GC() to verify if the finalizer is programmed
> properly. The temporary file is deleted successfully. Then I create the
> file and the pointer again and close the R session without saving the
> global environment. Since the external pointer is removed when closing R,
> so the finalizer should be called in this procedure. However, the temp file
> still exists after closing the R session.
>
> Here is the test code(which can be found in inst/example/example.R)
>
> ## Create a temporary file
> tmpFile <- paste0(system.file(package = "testPackage"), "/tmp")
> tmpFile
> file.create(tmpFile)
> file.exists(tmpFile)
> ## Create an external pointer whose finalizer will delete
> ## the file when the variable is not in used
> x <- testPackage:::makeExtPtr(file.remove,tmpFile)
> ## GC is working fine
> rm(list="x")
> gc()
> file.exists(tmpFile)
>
> ## Create the temporary file again
> file.create(tmpFile)
> file.exists(tmpFile)
> x <- testPackage:::makeExtPtr(file.remove,tmpFile)
> ## Quit R session without explicitly cleaning the working space
> quit(save = "no")
>
>
> ##=====Open a new R session=======
> ## The temporary file still exist
> tmpFile <- paste0(system.file(package = "testPackage"), "/tmp")
> file.exists(tmpFile)
>
> Not sure if this behavior is designed on purpose, but it sounds wired to me
> and can cause memory leaking if not properly handled.
>
> Best,
> Jiefei
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list