C++11 like Smart pointers. It always uses the shared allocator.
Procs
proc `=destroy`[T](p: var UniquePtr[T]) {....raises: [].}
proc newConstPtr[T](val: sink T): ConstPtr[T]
proc newUniquePtr[T](val: sink T): UniquePtr[T] {.nodestroy.}
Converters
converter convertConstPtrToObj[T](p: ConstPtr[T]): lent T {.inline.}
converter convertUniquePtrToObj[T](p: UniquePtr[T]): var T {.inline.}