r-lib / cpp11

cpp11 helps you to interact with R objects using C++ code.
https://cpp11.r-lib.org/
Other
193 stars 46 forks source link

Memory leak with reassigning `cpp11::writable::list`, and maybe others #338

Open krlmlr opened 8 months ago

krlmlr commented 8 months ago

Reassigning an auto variable generated from a call to a function that returns cpp11::writable::list appears to leak memory.

Downstream: https://github.com/r-dbi/RMariaDB/issues/309.

cpp11::cpp_source(quiet = FALSE, cxx_std = "CXX17", code = "
#include <cpp11.hpp>

cpp11::writable::list test_list() {
  return cpp11::writable::list(10000);
}

[[cpp11::register]]
cpp11::list test_list3() {
  auto out = test_list();
  out = test_list();
  out = test_list();
  return out;
}
")
#> ℹ 1 functions decorated with [[cpp11::register]]
#> using C++ compiler: ‘Apple clang version 15.0.0 (clang-1500.0.40.1)’
#> using C++17
#> using SDK: ‘MacOSX14.0.sdk’
#> ccache clang++ -arch arm64 -std=gnu++17 -I"/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/include" -DNDEBUG -I'/Users/kirill/Library/R/arm64/4.3/library/cpp11/include'  -I/opt/homebrew/include    -fPIC  -O0 -g -Wmacro-redefined -Wno-everything -c /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/code_180e147ff91b.cpp -o /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/code_180e147ff91b.o
#> ccache clang++ -arch arm64 -std=gnu++17 -I"/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/include" -DNDEBUG -I'/Users/kirill/Library/R/arm64/4.3/library/cpp11/include'  -I/opt/homebrew/include    -fPIC  -O0 -g -Wmacro-redefined -Wno-everything -c /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/cpp11.cpp -o /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/cpp11.o
#> ccache clang++ -arch arm64 -std=gnu++17 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib -L/opt/homebrew/lib -o /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/code_180e147ff91b.so /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/code_180e147ff91b.o /private/var/folders/dj/yhk9rkx97wn_ykqtnmk18xvc0000gn/T/Rtmpsq7RPu/file180e56b92260/src/cpp11.o -F/Library/Frameworks/R.framework/Versions/4.3-arm64 -framework R -Wl,-framework -Wl,CoreFoundation
#> ld: warning: -single_module is obsolete
#> ld: warning: -multiply_defined is obsolete

gc()
#>           used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
#> Ncells  845351 45.2    1449535 77.5         NA  1449535 77.5
#> Vcells 1511050 11.6    8388608 64.0      24576  2326823 17.8

for (i in 1:3) {
  for (j in 1:100) {
    test_list3()
  }
  print(gc())
}
#>           used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
#> Ncells  846348 45.2    1449535 77.5         NA  1449535 77.5
#> Vcells 3512756 26.9    8388608 64.0      24576  4541845 34.7
#>           used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
#> Ncells  846748 45.3    1449535 77.5         NA  1449535 77.5
#> Vcells 5512779 42.1   10146329 77.5      24576  6512871 49.7
#>           used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
#> Ncells  847150 45.3    1449535 77.5         NA  1449535 77.5
#> Vcells 7512799 57.4   12255594 93.6      24576  8512899 65.0

Created on 2023-10-23 with reprex v2.0.2

pachadotdev commented 6 months ago

here is the full valgrind output of the previous example

valgrind.txt