System::SmartPtr класс

SmartPtr class

Класс указателя для обёртывания типов, выделяемых в куче. Используйте его для управления памятью классов, наследующих Object. Этот тип указателя следует семантике внедряемого указателя. Счётчик ссылок хранится либо в самом Object, либо в структуре счётчика, тесно связанной с экземпляром Object. В любом случае все экземпляры SmartPtr образуют единую группу владения независимо от того, как они были созданы, что отличается от поведения класса std::shared_ptr. Преобразование обычного указателя в SmartPtr безопасно, поскольку существуют другие экземпляры SmartPtr, удерживающие совместные ссылки на тот же объект. Экземпляр класса SmartPtr может находиться в одном из двух состояний: shared pointer и weak pointer. Чтобы объект оставался живым, количество совместных ссылок на него должно быть положительным. Как weak, так и shared указатели могут использоваться для доступа к объекту (вызов методов, чтение или запись полей и т.д.), но weak указатели не участвуют в подсчёте ссылок shared указателя. Object удаляется, когда последний ‘shared’ SmartPtr указатель на него уничтожается. Поэтому убедитесь, что этого не происходит, когда нет других shared SmartPtr указателей на объект, например, во время конструирования или разрушения объекта. Используйте объекты‑сторожи System::Object::ThisProtector (в коде C++) или атрибуты CppCTORSelfReference и CppSelfReference (в переводимом коде C#), чтобы решить эту проблему. Аналогично, разорвите циклические ссылки, используя класс указателя System::WeakPtr или режим указателя System::SmartPtrMode::Weak (в коде C++) или атрибут CppWeakPtr (в переводимом коде C#). Если два или более объекта ссылаются друг на друга с помощью ‘shared’ указателей, они никогда не будут удалены. Если тип указателя (weak или shared) должен переключаться во время выполнения, используйте метод System::SmartPtr::set_Mode() или класс System::DynamicWeakPtr. Класс SmartPtr не содержит виртуальных методов. Наследовать его следует только если вы разрабатываете собственную стратегию управления памятью. Этот тип представляет собой указатель для управления удалением другого объекта. Его следует размещать в стеке и передавать в функции по значению или по константной ссылке.

template<class T>class SmartPtr
ПараметрОписание
TТип указываемого объекта. Должен быть либо System::Object, либо его подкласс.

Методы

МетодОписание
begin()Аксессор метода begin() базовой коллекции. Компилируется только если SmartPtr_ является специализированным типом с методом begin().
begin() constАксессор метода begin() базовой коллекции. Компилируется только если SmartPtr_ является специализированным типом с методом begin().
Cast() constПреобразует указатель к его собственному типу.
Cast() constПреобразует указатель к базовому типу с помощью static_cast.
Cast() constПреобразует указатель к производному типу с помощью dynamic_cast.
Cast() constПреобразует указатель к производному типу с помощью dynamic_cast.
cbegin() constДоступ к методу cbegin() базовой коллекции. Компилируется только если SmartPtr_ является специализированным типом с методом cbegin().
cend() constДоступ к методу cend() базовой коллекции. Компилируется только если SmartPtr_ является специализированным типом с методом cend().
const_pointer_cast() constПреобразует указатель к другому типу с помощью const_cast над объектом, на который он указывает.
dynamic_pointer_cast() constПреобразует указатель к другому типу с помощью dynamic_cast над объектом, на который он указывает.
end()Доступ к методу end() базовой коллекции. Компилируется только если SmartPtr_ является специализированным типом с методом end().
end() constДоступ к методу end() базовой коллекции. Компилируется только если SmartPtr_ является специализированным типом с методом end().
get() constПолучает объект, на который указывает указатель.
get_Mode() constПолучает режим указателя.
get_shared() constПолучает объект, на который указывает указатель, но проверяет, что указатель находится в режиме shared.
get_shared_count() constПолучает количество существующих shared‑указателей на объект, на который ссылаются, включая текущий. Проверяется, что текущий указатель находится в режиме shared.
GetHashCode() constВызывает GetHashCode() у объекта, на который указывает указатель.
GetObjectNotNull() constПолучает текущий объект, на который есть ссылка (если есть), или бросает исключение.
GetObjectOrNull() constПолучает объект, на который указывает указатель (если есть), или nullptr. То же, что и get().
GetObjectOwner() constПолучает объект, на который есть ссылка.
GetPointer() constПолучает объект, на который указывает указатель (если есть), или nullptr. То же, что и get().
Is(const System::TypeInfo&) constПроверяет, является ли объект, на который указывает указатель, конкретным типом или его дочерним типом. Соответствует семантике C# ‘is’.
IsAliasingPtr() constПроверяет, указывает ли указатель на объект, отличный от собственного (созданный конструктором алиасинга).
IsShared() constПроверяет, находится ли указатель в режиме shared.
IsWeak() constПроверяет, находится ли указатель в режиме weak.
explicit operator bool() constПроверяет, что указатель не равен null.
operator!() constПроверяет, что указатель равен null.
operator*() constПолучает ссылку на объект, на который указывает указатель. Проверяется, что указатель не равен null.
operator->() constПозволяет обращаться к членам объекта, на который есть ссылка.
operator<(Y *) constОбеспечивает семантику сравнения на меньше для класса SmartPtr.
operator<(SmartPtr<Y> const&) constОбеспечивает семантику сравнения на меньше для класса SmartPtr.
operator=(SmartPtr_&&)Перемещающее присваивание объекту SmartPtr. x становится непригодным.
operator=(const SmartPtr_&)Копирующее присваивание объекту SmartPtr.
operator=(const SmartPtr<Q>&)Копирующее присваивание объекту SmartPtr. Выполняет необходимые преобразования типов.
operator=(Pointee_ *)Присваивает сырой указатель объекту SmartPtr.
operator=(std::nullptr_t)Устанавливает значение указателя в nullptr.
operator==(std::nullptr_t) constПроверяет, указывает ли указатель на nullptr.
operator[](IdxType) constДоступ к элементам массива. Компилируется только если SmartPtr_ является специализацией System::Array.
RemoveAliasing() constУдаляет алиасинг (созданный конструктором алиасинга) из указателя, гарантирует, что он управляет (если shared) или отслеживает (если weak) тот же объект, на который указывает.
reset(Pointee_ *)Устанавливает указываемый объект.
reset()Заставляет указатель указывать на nullptr.
set_Mode(SmartPtrMode)Устанавливает режим указателя. Может изменять счётчики ссылок у целевого объекта.
SetContainedTemplateWeakPtr(uint32_t) constВызывает метод SetTemplateWeakPtr() у указываемого объекта (если он есть).
SmartPtr(SmartPtrMode)Создаёт объект SmartPtr требуемого режима.
SmartPtr(std::nullptr_t, SmartPtrMode)Создаёт объект SmartPtr с нулевым указателем требуемого режима.
SmartPtr(Pointee_ *, SmartPtrMode)Создаёт SmartPtr, указывающий на указанный объект, или преобразует сырой указатель в SmartPtr.
SmartPtr(const SmartPtr_&, SmartPtrMode)Копирующее конструирование объекта SmartPtr. Оба указателя указывают на один и тот же объект после этого.
SmartPtr(const SmartPtr<Q>&, SmartPtrMode)Копирующее конструирование объекта SmartPtr. Оба указателя указывают на один и тот же объект после этого. Выполняет преобразование типов, если разрешено.
SmartPtr(SmartPtr_&&, SmartPtrMode)Перемещающее конструирование объекта SmartPtr. По сути, меняет местами два указателя, если они находятся в одинаковом режиме. x может стать непригодным после вызова.
explicit SmartPtr(const SmartPtr<Array<Y>>&, SmartPtrMode)Преобразует тип ссылочного массива, создавая новый массив другого типа. Полезно, если в C# есть приведение типа массива, которое не поддерживается в C++.
explicit SmartPtr(const Y&)Инициализирует пустой массив. Используется для преобразования некоторых конструкций кода C#.
SmartPtr(const SmartPtr<P>&, Pointee_ *, SmartPtrMode)Конструирует SmartPtr, который разделяет информацию о владении с исходным значением ptr, но содержит несвязанный и неуправляемый указатель p.
static_pointer_cast() constПреобразует указатель к другому типу с помощью static_cast на указываемом объекте.
ToObjectPtr() constПреобразует любой тип указателя в указатель на Object. Не требует, чтобы тип Pointee_ был полным.
static Type()Сокращение для получения объекта System::TypeInfo для типа Pointee_ .
~SmartPtr()Уничтожает объект SmartPtr. При необходимости уменьшает счётчик ссылок указываемого объекта и удаляет объект.

Typedefs

Типовое определениеОписание
ArrayTypeТо же, что и Pointee_, если это специализация System::Array, иначе — void.
Pointee_Тип, на который указывает.
SmartPtr_Тип специализированного умного указателя.
ValueTypeТип хранилища указываемого массива. Имеет смысл только если T является специализацией System::Array.

См. также