Perl 6 nativecast() 是否会在 GC 时对具有 repr('CPointer') DESTROY 的对象进行处理?
Does Perl 6 nativecast() to an object with repr('CPointer') DESTROY when GC'ed?
读Basic use of Pointers表示当一个NativeCall
C函数returns指向一个带有class和repr('CPointer')
的对象时,它会调用submethod DESTROY
我可以把我的函数放到哪里来释放 C 内存。 (顺便说一句,这真是太棒了,而且是一项了不起的能力。)
如果我取回通用 Pointer
,但后来决定 nativecast()
将其 class 怎么办?那请问垃圾回收时也能正确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;
当 Foo
被回收时将调用析构函数,即使所述 Foo
是通过 nativecast
创建的。如果需要,您可以在两者之间添加到 Pointer
的显式转换,但这不应该也不会产生任何影响。
读Basic use of Pointers表示当一个NativeCall
C函数returns指向一个带有class和repr('CPointer')
的对象时,它会调用submethod DESTROY
我可以把我的函数放到哪里来释放 C 内存。 (顺便说一句,这真是太棒了,而且是一项了不起的能力。)
如果我取回通用 Pointer
,但后来决定 nativecast()
将其 class 怎么办?那请问垃圾回收时也能正确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;
当 Foo
被回收时将调用析构函数,即使所述 Foo
是通过 nativecast
创建的。如果需要,您可以在两者之间添加到 Pointer
的显式转换,但这不应该也不会产生任何影响。