nativecast() 是否创建了一个新容器?

Fer*_*ata 7 nativecall raku

我正在编写一个 C 库的接口。AC 函数分配一些内存,读取一个值,并返回一个void *指向该缓冲区的指针,随后将被释放。
我希望确保当我将调用的输出分配给nativecast(Str, $data)Raku Str 变量时,数据被分配给变量(复制到),而不仅仅是绑定到它,所以我可以释放 C 函数分配的空间任务完成后不久。

这大概是代码的样子:

my Pointer $data = c_read($source);
my Str $value = nativecast(Str, $data);
c_free($data);
# $value is now ready to be used
Run Code Online (Sandbox Code Playgroud)

我通过 valgrind 运行此代码,它没有报告任何尝试引用已释放的内存缓冲区的情况。我还是很好奇。

Bra*_*ert 7

for 的内部Str结构与C字符串完全不兼容。因此,在使用它们之前必须对其进行解码。

更具体地说,如果还没有 NFC 代码点,MoarVM 会将字素簇存储为 [负] 合成代码点。这意味着即使是同一个程序的两个实例也可能对同一个字素簇使用不同的合成代码点。

即使忽略这一点,MoarVM 也将字符串存储为不可变的数据结构。这意味着它不能只使用C字符串,因为C代码可能会在打破该假设的 MoarVM 下更改它。

我确信还有很多原因不能按原样使用C字符串。


就像我说的, 的内部结构StrC字符串完全不兼容。因此,它继续使用C函数分配的空间的可能性为零。

这里最大的问题是nativecast在释放缓冲区后调用。