Either you use destructors, or you use ref with finalizers
Pseudo code
Destructors version
type NimBox = object
handle: ptr Box
proc `=`(dst: var NimBox, src: NimBox){.error: "Copying is not allowed".}
proc `=destroy`(b: var NimBox) {.inline.}=
release(b.handle)
proc `=sink`(dst: var NimBox, src: NimBox) {.inline.} =
`=destroy`(dst)
`=sink(dst.handle, src.handle)
proc newNimBox(size: int): NimBox =
result.handle = box_new(size)
Run
Ref version
type
NimBox = ref object
handle: ptr Box
proc finalize(b: NimBox) =
if not b.isNil:
release(b.handle)
proc newNimBox(size: int): NimBox =
new result, finalize
result.handle = box_new(size)
Run