Уничтожает ли 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 между ними, но это не должно и не имеет никакого значения.

Другие вопросы по тегам