require "ffi"
class Releasable < FFI::AutoPointer
def self.release(pointer)
puts "Release"
# no op
end
end
p = FFI::Pointer.new(1)
r = Releasable.new(p)
r.free
p r.autorelease? # => NullPointerException
It’s because when AutoPointer#free is called, the reaper (managed for releasing the pointer) is reassigned to null. This causes AutoPointer#autorelease? to fail, since reaper is now no longer.