nativecast() 会创建一个新容器吗?

Does nativecast() create a new container?

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

代码大致如下:

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

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

Str 的内部结构与 C 字符串完全不兼容。所以在使用前必须解码。

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

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

我敢肯定还有很多原因导致它无法按原样使用 C 字符串。


正如我所说,Str 的内部结构与 C 字符串完全不兼容。因此它继续使用由 C 函数分配的 space 的可能性为零。

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