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



我正在编写一个C库的接口。C函数分配一些内存,读取一个值,并返回一个指向该缓冲区的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

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

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

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

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

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


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

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

相关内容

最新更新