Класс System::SmartPtr

SmartPtr class

Класс‑указатель для обёртывания типов, выделяемых в куче. Используйте его для управления памятью классов, наследующих Object. Этот тип указателя следует семантике внедрённых указателей. Счётчик ссылок хранится либо в самом Object, либо в структуре счётчика, тесно связанной с экземпляром Object. В любом случае все экземпляры SmartPtr образуют единую группу владения независимо от способа их создания, что отличается от поведения класса std::shared_ptr. Преобразование обычного указателя в SmartPtr безопасно, если существуют другие экземпляры SmartPtr, удерживающие общие ссылки на тот же объект. Экземпляр класса SmartPtr может находиться в одном из двух состояний: shared pointer и weak pointer. Чтобы объект оставался живым, количество shared ссылок на него должно быть положительным. И слабые, и shared указатели могут использоваться для доступа к объекту (вызов методов, чтение или запись полей и т.д.), но слабые указатели не участвуют в подсчёте ссылок 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Проверяет, указывает ли указатель на объект, отличный от собственного (созданный aliasing‑конструктором).
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Удаляет aliasing (созданный aliasing‑конструктором) из указателя, гарантируя, что он управляет (если 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.

См. также