Уничтожает ли Perl 6 nativecast() для объекта с repr('CPointer'), когда GC'ed?
Чтение Основного использования Указателей указывает, что когда NativeCall
Функция C возвращает указатель на объект с классом с repr('CPointer')
позвонит submethod DESTROY
где я могу поставить свою функцию, чтобы освободить память C. (Между прочим, это фантастическая и удивительная способность.)
Что если я вернусь к дженерику Pointer
, но позже решу nativecast()
это к классу? Будет ли это также правильно DESTROY()
это когда мусор собирали? Я думаю (и надеюсь), что это будет, но не смог доказать это себе.
1 ответ
Я сильно подозреваю, что это произойдет, учитывая поведение следующего контрольного примера:
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
между ними, но это не должно и не имеет никакого значения.