[Rd] [PATCH] Fix memory leak in PicTeXDeviceDriver
Martin Maechler
maechler at stat.math.ethz.ch
Fri Jul 21 17:27:48 CEST 2017
>>>>> Steve Grubb <sgrubb at redhat.com>
>>>>> on Thu, 20 Jul 2017 17:06:52 -0400 writes:
> Hello,
> This patch fixes a memory leak due to ptd going out of scope
> before its assigned to dd.
Hmm, I'm not an expert here, but I tend to say
that it may not be a memory leak because the corresponding
function is static and only called from inside PicTeX() and that has
const void *vmax = vmaxget();
at the beginning, and ends with
vmaxset(vmax);
return R_NilValue;
maybe because the code writer "saw" that it could not really
free everything correctly ?
The following code - after install.package("sfsmisc")
seems to suggest a very small "leak" but only up to some point, and your
patch does not seem to change much about it:
if(!require("sfsmisc")) install.packages("sfsmisc") # for Sys.sizes()
## but that's not available on Windoze ...
monitor <- function(call, n = 10000, every = n %/% 50, doGC = TRUE) {
for(i in seq_len(n)) {
if(i == 1 || i %% every == 0) {
if(doGC) gc()
ns <- names(ss <- Sys.sizes())
cat(sprintf("%5d: (%s=%7d, %s=%7d)\n",
i, ns[1], ss[[1]], ns[2], ss[[2]]))
}
eval(call)
}
}
monitor(quote({pictex(); dev.off()}))
## -------- ^\______needed, otherwise have too many open devices
## goes up to some and then stays
monitor(quote({pdf(); dev.off()}))
## ---
## goes up to some and then stays ...[almost, sometimes increases still a bit]
## is not much different to pictex()
But I've added a free(ptd) --- in a way where the code
is slightly easier to parse by a human.
Thank you, Steve!
Martin
> Signed-off-by: Steve Grubb <sgrubb at redhat.com>
> Index: src/library/grDevices/src/devPicTeX.c
> ===================================================================
> --- src/library/grDevices/src/devPicTeX.c (revision 72935)
> +++ src/library/grDevices/src/devPicTeX.c (working copy)
> @@ -665,8 +665,10 @@
> ptd-> width = width;
> ptd-> height = height;
> - if( ! PicTeX_Open(dd, ptd) )
> + if( ! PicTeX_Open(dd, ptd) ) {
> + free(ptd);
> return FALSE;
> + }
> /* Base Pointsize */
> /* Nominal Character Sizes in Pixels */
More information about the R-devel
mailing list