Класс System::SmartPtr

SmartPtr class

Класс‑указатель для обёртывания типов, выделяемых в куче. Используйте его для управления памятью классов, наследующих Object. Этот тип указателя следует семантике внедрённых указателей. Счётчик ссылок хранится либо в самом Object, либо в структуре счётчика, тесно связанной с экземпляром Object. В любом случае все экземпляры SmartPtr образуют единую группу владения независимо от способа их создания, что отличается от поведения класса std::shared_ptr. Преобразование обычного указателя в SmartPtr безопасно, поскольку существуют другие экземпляры SmartPtr, удерживающие совместные ссылки на тот же объект. Экземпляр класса SmartPtr может находиться в одном из двух состояний: совместный указатель и слабый указатель. Чтобы объект оставался живым, количество совместных ссылок на него должно быть положительным. И слабые, и совместные указатели могут использоваться для доступа к объекту (вызов методов, чтение или запись полей и т.д.), но слабые указатели не участвуют в подсчёте ссылок совместных указателей. Object удаляется, когда последний ‘shared’ указатель SmartPtr на него уничтожается. Поэтому убедитесь, что этого не происходит, когда нет других совместных указателей SmartPtr на объект, например, во время конструирования или разрушения объекта. Используйте охранные объекты System::Object::ThisProtector (в коде C++) или атрибуты CppCTORSelfReference и CppSelfReference (в переводимом коде C#), чтобы решить эту проблему. Аналогично, разорвите циклические ссылки, используя класс указателя System::WeakPtr или режим указателя System::SmartPtrMode::Weak (в коде C++) или атрибут CppWeakPtr (в переводимом коде C#). Если два или более объекта ссылаются друг на друга с помощью ‘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Получает указанный объект, но проверяет, что указатель находится в режиме совместного доступа.
get_shared_count() constПолучает количество совместных указателей, существующих для ссылочного объекта, включая текущий. Проверяет, что текущий указатель находится в режиме совместного доступа.
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Проверяет, находится ли указатель в режиме совместного доступа.
IsWeak() constПроверяет, находится ли указатель в режиме слабой ссылки.
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Удаляет алиасинг (созданный конструктором алиасинга) из указателя, гарантируя, что он управляет (если совместный) или отслеживает (если слабый) тот же объект, на который указывает.
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.

См. также