My implementation of SmartPtrs: UniquePtr SharedPtr WeakPtr (correct behavior when using with SharedPtr)