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

iuke-tier@ey m@iii@g oii uiow@@edu iuke-tier@ey m@iii@g oii uiow@@edu
Fri Apr 3 15:14:53 CEST 2020

Use R_RegisterFinalizerEx in your C code. See


This still gives you only "best effort"; for anything stronger you
would need a different approach.

In general, finalizers should only be used as a backstop, not as a
primary resource management tool (in R or any other garbage-collected

Memory leaks are not an issue -- unless you are doing very unusual
things your OS will reclaim memory resources used by your process when
it exits, cleanly or otherwise.



On Fri, 3 Apr 2020, Wang Jiefei 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

Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney using uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu

More information about the R-devel mailing list