Just saw a library that implemented its smart pointer’s assignment operator as: if (inValue.ptr) { ptr = inValue.ptr; ptr.retain(); } So no way to reset to NULL, and leaks the old pointer. At least add an assert(ptr == NULL) ?