rcpp - 从 Rcpp 调用 stats::optim 如何导致内存泄漏?
问题描述
在我的部分代码中,我需要优化来自 Rcpp 的函数(我按照这里的第二个答案Applying the optim function in R in C++ with Rcpp)。但是,我发现该函数会泄漏内存(很少,但如果它是重复运行模拟的一部分,它会复杂化)。我创建了一个最小的可重现示例,但我不知道泄漏的来源/如何处理它。我可以就处理这个问题寻求指导吗?
rcpp 代码:
#include <Rcpp.h>
using namespace Rcpp;
double objective_function(double x){
double obj = .666 - x;
return pow(obj, 2);
}
// [[Rcpp::export(leak)]]
double leak(double a, double b){
// Extract R's optim function
Rcpp::Environment stats("package:stats");
Rcpp::Function optim = stats["optim"];
// Call the optim function from R in C++
Rcpp::List opt_results = optim(Rcpp::_["par"] = .5,
Rcpp::_["fn"] = Rcpp::InternalFunction(&objective_function),
Rcpp::_["method"] = "Brent",
Rcpp::_["lower"] = a,
Rcpp::_["upper"] = b);
// Extract out the estimated parameter values
double mu = opt_results[0];
// Return estimated values
return mu;
}
代码:
repeat{
leak(0, 1)
}
当我查看任务管理器时,Rstudio R Session 下的 RAM 使用量正在稳步增加(如果我使用任何其他只返回值的函数,则不会发生这种情况)。
解决方案
使用 macOS + Instruments 检漏仪,似乎Rcpp::InternalFunction
正在泄漏:
这将我们指向这里的代码:
请注意,我们使用 分配一个对象new
,但我们也告诉XPtr
不要注册删除终结器:
我不清楚我们为什么要这样做,但我认为它解释了这种行为。可能值得提出一个问题。
推荐阅读
- c# - HttpWebResponse().GetResponse 超时
- python - 逐步从shell执行python包,例如调试模式
- internet-explorer-11 - Outlook Web 加载项 - 在邮件之间清除本地存储
- fhir-server-for-azure - 不要保留资源的历史记录
- python - 求解 Dijkstra 算法 - 使用两条边传递成本/父母
- c++ - 错误 Windows 标头需要 winnt.h 上的默认打包选项
- bazel - Bazel 链接库:如何更改为链接到已构建库?
- android - firebase 数据库仅在读写设置为 true 时工作
- node.js - 有没有办法修复节点中的这个 Mailchimp API 错误?
- c# - .Net Core C# 将方法/类作为子进程执行