add smart_ptr