《编写 R 扩展》第 5.13 节“外部指针和弱引用”指出:
外部指针 SEXP 旨在处理对 C 结构的引用,例如“句柄”,并且在 RODBC 包中用于此目的。它们的复制语义很不寻常,因为当复制 R 对象时,外部指针对象不会重复。(因此,外部指针只能用作具有正常语义的对象的一部分,例如列表的属性或元素。)
这里的“外部指针对象”是什么意思,外部指针本身还是外部指针指向的内存?为什么不寻常的复制语义意味着外部指针只能用作具有正常语义的对象的一部分?
澄清一下,我的 R 包是 C 库 Baz 的包装器。Baz 库提供了一个 C 结构,FooBaz 将其用作一种内部工作空间。Baz 提供 C 函数Foo* baz_allocate_foo()以及void baz_free_foo(Foo*)分配和释放Foo结构,这是在 R 内存管理之外执行的。
在我的 R 包中,我想使用外部指针来存储这些分配的结构的地址Foo。我的 R 包的 C++ 代码的一部分(使用 Rcpp 进行接口)如下所示:
// baz.h is the Baz C library header; contains the definition of struct Foo
#include <R.h>
#include <Rinternals.h>
extern "C" {
#include <baz.h>
}
// For …Run Code Online (Sandbox Code Playgroud) r ×1