阅读指针的基本使用表明,当NativeCall
C 函数返回指向具有类的对象的指针时repr('CPointer')
,它将调用submethod DESTROY
我可以放置函数的位置以释放 C 内存。(顺便说一句,这太棒了,而且是一项了不起的能力。)
如果我拿回了一个 generic Pointer
,但后来决定把nativecast()
它交给课堂怎么办?垃圾收集时也会正确DESTROY()
吗?我认为(并希望)它会,但无法向自己证明这一点。
阅读指针的基本使用表明,当NativeCall
C 函数返回指向具有类的对象的指针时repr('CPointer')
,它将调用submethod DESTROY
我可以放置函数的位置以释放 C 内存。(顺便说一句,这太棒了,而且是一项了不起的能力。)
如果我拿回了一个 generic Pointer
,但后来决定把nativecast()
它交给课堂怎么办?垃圾收集时也会正确DESTROY()
吗?我认为(并希望)它会,但无法向自己证明这一点。
鉴于以下测试用例的行为,我强烈怀疑它会:
use NativeCall;
my $done = False;
class Foo is repr<CPointer> {
method id { nativecast(Pointer[int32], self).deref }
# only log destrution of first object
submethod DESTROY {
if !$done {
$done = True;
say "first Foo with id {self.id} has died";
}
}
}
# avoid premature collection of buffers
my @keep-alive;
# allocate a bunch of buffers and cast them to Foo
# keep going until the garbage collector gets triggered
my $ = nativecast(Foo, @keep-alive.push(buf32.new($++)).tail)
while !$done;
当 a 被回收时,将调用析构函数Foo
,即使 saidFoo
是通过 a 创建的nativecast
。如果您愿意,您可以在中间添加一个显式转换Pointer
,但这不应该也没有任何区别。