【问题标题】:Does nativecast() create a new container?nativecast() 是否创建一个新容器?
【发布时间】:2021-04-18 09:30:20
【问题描述】:

我正在编写一个 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 运行此代码,它没有报告任何引用已释放内存缓冲区的尝试。我还是很好奇。

【问题讨论】:

    标签: raku nativecall


    【解决方案1】:

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

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

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

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


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2016-06-09
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多