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