Fix R memory leak on exception
There is a possible memory leak in case the SWIG_exception_fail macro is called. The problem is related to its definition that call the function Rf_warning. This function (as well as Rf_error) involves a longjmp over C++ destructors on the stack. Thus, all the objects allocated on the heap are not freed. Closes #914
This commit is contained in:
parent
b0ce22625b
commit
3fa5c8c652
6 changed files with 129 additions and 8 deletions
26
Examples/test-suite/r/r_memory_leak_runme.R
Normal file
26
Examples/test-suite/r/r_memory_leak_runme.R
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
clargs <- commandArgs(trailing=TRUE)
|
||||
source(file.path(clargs[1], "unittest.R"))
|
||||
|
||||
dyn.load(paste("r_memory_leak", .Platform$dynlib.ext, sep=""))
|
||||
source("r_memory_leak.R")
|
||||
cacheMetaData(1)
|
||||
|
||||
a <- Foo();
|
||||
unittest(Foo_get_count(), 1);
|
||||
b <- Foo();
|
||||
unittest(Foo_get_count(), 2);
|
||||
|
||||
# Normal behaviour
|
||||
invisible(trigger_internal_swig_exception("no problem", a));
|
||||
unittest(Foo_get_count(), 2);
|
||||
# SWIG exception introduced
|
||||
result <- tryCatch({
|
||||
trigger_internal_swig_exception("null", b);
|
||||
}, warning = function(w) {
|
||||
# print(" Hum... We received a warning, but this should be an error");
|
||||
unittest(1,0);
|
||||
}, error = function(e) {
|
||||
# print(" Gotcha!");
|
||||
unittest(1,1);
|
||||
})
|
||||
unittest(Foo_get_count(), 2);
|
||||
Loading…
Add table
Add a link
Reference in a new issue