从R语言调用的C函数中的动态内存分配

时间:2016-09-05 09:04:14

标签: c r memory memory-management

我正在编写一个调用C脚本的R包。 C脚本使用具有动态确定长度的结构:数组forest->edges的长度取决于从R传递的数据。

typedef struct {
  unsigned int n_edge;
  ...
  unsigned int max_node;
  unsigned int edges[];
} forest;

forest * forest_new (unsigned int *n_edge) {
  forest *f = malloc(sizeof(forest) + (2 * *n_edge * sizeof(int)));
  f->n_edge     = *n_edge;
  ...
  f->max_node   = 0;
  return f;
}

代码在C中成功运行,但在R调用触发forest_new时崩溃。我的预感是崩溃是由内存分配造成的,实际上R manual提到了分配内存的替代方法(例如R_allocCalloc),threads {{3} }似乎建议应该用来代替malloc / calloc

问题的第一部分是对malloc / calloc的调用应该或必须由R安全等价物替换(可能它们与我的问题无关?)。 问题的第2部分是R-safe函数如何处理长度是动态确定的结构。

1 个答案:

答案 0 :(得分:1)

您可以在包中使用freeCalloc/Free/Realloc来分配和释放内存,但您必须处理任何C应用程序中的内存不足错误。您可以使用R提供的R_alloc,然后您将获得以“R方式”处理的错误(内存不足时出现R错误)。 n_edge函数允许您分配在外部函数退出时自动释放的临时数据(当您返回R时,它是基于堆栈的分配)。

R不关心您的C代码是否使用具有动态确定长度的结构(灵活数组),R根本不访问您的结构。

如果您需要更多帮助,请发布自包含的示例或提供有关错误的更多信息。也许值得检查forest_newlocalhost中有正确/合理的值。